perm filename HAL.PLT[HAL,HE] blob sn#120134 filedate 1974-09-13 generic text, type T, neo UTF8
≠COMMEN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 1
	HAL PAL[HAL,HE]	PAGE 1 	

≥				COMMENT ⊗   VALID 00002 PAGES
≥				C REC  PAGE   DESCRIPTION
≥				C00001 00001
≥				C00002 00002	.TITLE HAL Runtime System
≥				C00003 ENDMK
≥					C⊗;
≠.TITLE≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 2
	HAL PAL[HAL,HE]	PAGE 2 	

≥					.TITLE HAL Runtime System
≥					
≠.INSRT≡≥					.INSRT HALHED.PAL[HAL,HE]
≠COMMEN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 3
	HALHED PAL[HAL,HE]	PAGE 1 	

≥				COMMENT ⊗   VALID 00004 PAGES
≥				C REC  PAGE   DESCRIPTION
≥				C00001 00001
≥				C00002 00002	.SBTTL	DEFS -- standard definitions for HAL runtime routines
≥				C00005 00003	routine calling and defining macros.
≥				C00007 00004	Graph structure definitions
≥				C00008 ENDMK
≥					C⊗;
≠.SBTTL≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 4
	HALHED PAL[HAL,HE]	PAGE 2 	DEFS -- standard definitions for HAL runtime routines

≥					.SBTTL	DEFS -- standard definitions for HAL runtime routines
≥					
≥					; PROGRAM DEFINITIONS
≥					
≡ERRTRP≠≥		000004			ERRTRP=4		;time out and error trap
≡ILGINS≠≥		000010			ILGINS=10		;illegal instruction
≡CLKTRP≠≥		000104			CLKTRP=104		;clock trap
≡RUG≠≥		050000			RUG=50000		;Restart of RUG
≡PS≠≥		177776			PS=177776		;processor status word
≡KBIS≠≥		177560			KBIS=177560		;keyboard input status
≡KBIR≠≥		177562			KBIR=177562		;keyboard input register
≡KBOS≠≥		177564			KBOS=177564		;keyboard output status
≡KBOR≠≥		177566			KBOR=177566		;keyboard output register
≡CLKCNT≠≥		172544			CLKCNT=172544		;clock counter
≡CLKSET≠≥		172542			CLKSET=172542		;clock set register
≡CLKS≠≥		172540			CLKS=172540		;clock status
≥					
≡STRT11≠≥		000500			STRT11=500		;starting address of program
≡IBUF≠≥		000150			IBUF=150		;start of input buffer from 11
≡OBUF≠≥		000160			OBUF=160		;start of output buffer to 11 
≡HCOR≠≥		077776			HCOR=77776		;highest useable word in core
≥					
≥					
≥					;REGISTER DEFINITIONS
≥					
≡%5≡≡AC5≠≥		000005			AC5=%5			;Floating point register
≡%4≡≡AC4≠≥		000004			AC4=%4			;   "       "      "
≡%3≡≡AC3≠≥		000003			AC3=%3			;   "       "      "
≡%2≡≡AC2≠≥		000002			AC2=%2			;   "       "      "
≡%1≡≡AC1≠≥		000001			AC1=%1			;Temp. F.P. register
≡%0≡≡AC0≠≥		000000			AC0=%0			; "     "      "
≡%7≡≡PC≠≥		000007			PC=%7			;program counter
≡%6≡≡SP≠≥		000006			SP=%6			;stack pointer
≡%5≡≡RF≠≥		000005			RF=%5			;Display pointer
≡%4≡≡R4≠≥		000004			R4=%4			;Saved across procedure calls
≡%3≡≡R3≠≥		000003			R3=%3			;Saved across procedure calls
≡%2≡≡R2≠≥		000002			R2=%2			;Saved across procedure calls
≡%1≡≡R1≠≥		000001			R1=%1			;temp
≡%0≡≡R0≠≥		000000			R0=%0			;temp
≥					
≥					;MARK DEFINITIONS
≡MARK0≠≥		006400			MARK0 = 6400		;MARK 0
≡MARK1≠≥		006401			MARK1 = 6401		;MARK 1
≡MARK2≠≥		006402			MARK2 = 6402		;ETC.
≡MARK3≠≥		006403			MARK3 = 6403
≡MARK4≠≥		006404			MARK4 = 6404
≡MARK5≠≥		006405			MARK5 = 6405
≥					
≥					;Arithmetic definitions
≡PLACES≠	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 5
	HALHED PAL[HAL,HE]	PAGE 2.1 	DEFS -- standard definitions for HAL runtime routines

≥		000000			PLACES = 0		;Number of bits to the right of the radix point in fixed.
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 6
	HALHED PAL[HAL,HE]	PAGE 3 	DEFS -- standard definitions for HAL runtime routines

≥					;routine calling and defining macros.
≥					;Coded by RHT 9/74.
≥					
≥					;This should be used at the start of routines which reference
≥					;	parameters off the RF stack.  It gives the parameters
≥					;	symbolic names for clarity of coding.
≥					;For example,
≥					;
≥					;	ROUTINE FOO,<A,B>
≥					;
≥					;Goes to
≥					;
≥					;	A==4
≥					;	B==2
≥					;FOO:
≥					
≠.MACRO≡≤ROUTIN≠≥					       .MACRO ROUTINE ID,ARGS
≥					           .IFNB ARGS
≥						    NNNN==0
≥						       .IRP II,<ARGS>		;Raise NNNN to twice the number of args.
≥							NNNN==NNNN+2
≥						       .ENDM
≥						       .IRP II,<ARGS>		;Assign each arg NNNN and decrease same.
≥							II == NNNN
≥							NNNN == NNNN-2
≥						       .ENDM
≥						   .ENDC
≥					ID:
≥					       .ENDM
≥					
≥					;This is useful in calling rountines which reference parameters off
≥					;	the RF stack.  It sets up the stack properly, but does not
≥					;	save R0 or R1.
≥					
≠.MACRO≡≤CALL≠≥					       .MACRO CALL ID,ARGS
≥						MOV	RF,-(SP)	;Save RF
≥						NNNN == 6400		;This is a MARK 0 instruction
≥						   .IFNB ARGS
≥						       .IRP II,<ARGS>
≥							MOV	II,-(SP);Push an argument
≥							NNNN == NNNN+1	;Make NNNN the next MARK instruction.
≥						       .ENDM
≥						   .ENDC
≥						MOV	#NNNN,-(SP)	;Push the mark instruction.
≥						MOV	SP,RF		;Set up the display in RF.
≥						JSR	PC,ID		;Call the routine
≥					       .ENDM
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 7
	HALHED PAL[HAL,HE]	PAGE 4 	DEFS -- standard definitions for HAL runtime routines

≥					;Graph structure definitions
≥					;RHT 9/74
≥					
≠.MACRO≡≤XX≠≥					       .MACRO	XX SYM			;Just gives SYM the next number.
≥						SYM == II
≥						II == II+2
≥					       .ENDM
≥					
≥					;CELL LINKS
≡II≠≥		000000				II==0
≤XX≡≥						XX	DATUM
≡II≡≡DATUM≠≡II≡≡II≠≤XX≡≥						XX	LINKF
≡II≡≡LINKF≠≡II≡≡II≠≤XX≡≥						XX	LINKB
≡II≡≡LINKB≠≡II≡≡II≠≥					
≥					;GRAPH NODES
≡II≠≥		000000				II==0
≤XX≡≥						XX	NXTGN		;CHAIN OF ALL GNODES IN THE WORLD
≡II≡≡NXTGN≠≡II≡≡II≠≤XX≡≥						XX	PRVGN
≡II≡≡PRVGN≠≡II≡≡II≠≤XX≡≥						XX	INVMRK		;USED AS FLAG
≡II≡≡INVMRK≠≡II≡≡II≠≤XX≡≥						XX	GNVAL		;POINTER AT VALUE
≡II≡≡GNVAL≠≡II≡≡II≠≤XX≡≥						XX	GNDEPS		;DEPENDENT GRAPH NODES
≡II≡≡GNDEPS≠≡II≡≡II≠≤XX≡≥						XX	GNCLCS		;CALCULATOR LIST (DBL LINKED)
≡II≡≡GNCLCS≠≡II≡≡II≠≤XX≡≥						XX	GNCHGS		;CHANGE LIST
≡II≡≡GNCHGS≠≡II≡≡II≠≥					
≥					;CALCULATOR CELL
≡II≠≥		000000				II==0
≤XX≡≥						XX	NXTCLC		;LIST LINK
≡II≡≡NXTCLC≠≡II≡≡II≠≤XX≡≥						XX	NEEDED		;LIST OF NEEDED NODES
≡II≡≡NEEDED≠≡II≡≡II≠≤XX≡≥						XX	FORM		;SOME SORT OF CODE TO EVAL
≡II≡≡FORM≠≡II≡≡II≠≥					
≥					;CHANGER CELL
≡II≠≥		000000				II==0
≤XX≡≥						XX	NXTCHG
≡II≡≡NXTCHG≠≡II≡≡II≠≤XX≡≥						XX	CHGCOD
≡II≡≡CHGCOD≠≡II≡≡II≠≥					
≡STRT11≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 8
	HAL PAL[HAL,HE]	PAGE 2.1 	DEFS -- standard definitions for HAL runtime routines

≥		000500			.=STRT11
≠.INSRT≡≥					.INSRT HALIO.PAL[HAL,HE]
≠COMMEN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 9
	HALIO PAL[HAL,HE]	PAGE 1 	DEFS -- standard definitions for HAL runtime routines

≥				COMMENT ⊗   VALID 00003 PAGES
≥				C REC  PAGE   DESCRIPTION
≥				C00001 00001
≥				C00002 00002	.SBTTL	TTY output routines
≥				C00005 00003	.SBTTL Useful macros for use of I/O routines
≥				C00007 ENDMK
≥					C⊗;
≠.SBTTL≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 10
	HALIO PAL[HAL,HE]	PAGE 2 	TTY output routines

≥					.SBTTL	TTY output routines
≥					;  Modified 5-Sep-74 by RF.  Originally written by KKP.
≥					
≥					;	Output a string, ending with a zero character. Pointer to start
≥					;	of string in R0.  Called in "simple" style.
≥					
≠.EVEN≡≥		000500			.EVEN
≡TYPSTR≠≠MOV≡≡R0≡≡R1≡≥	000500	010001			TYPSTR:	MOV R0,R1	;R1 ← LOC[STRING]
≠MOVB≡≡R1≡≡R0≡≥	000502	112100				MOVB (R1)+,R0	;R0 ← first byte of string
≡TSLOOP≠≠JSR≡≡PC≡≡TYPCHR≡≥	000504	004767	000056		TSLOOP:	JSR PC,TYPCHR	;Type this one character
≠MOVB≡≡R1≡≡R0≡≥	000510	112100				MOVB (R1)+,R0	;R0 ← Next byte of string
≠BNE≡≡TSLOOP≡≥	000512	001374				BNE TSLOOP	;If more to come, repeat.
≠RTS≡≡PC≡≥	000514	000207				RTS PC		;Done
≥					
≥					
≥					; Routines to output numbers.  Argument in R0.
≥					; TYPDEC outputs in base 10, and TYPOCT in base 8.
≥					; Both use TYPDIG as a subroutine, putting the digit
≥					;	in R0.
≥					; TYPCHR is a general purpose character output routine.
≥					
≠.EVEN≡≥		000516			.EVEN
≡TYPDEC≠≠MOV≡≡RADIX≡≥	000516	012767	000012	000020	TYPDEC:	MOV #12,RADIX	;To output in base 10
≠BR≡≡TYPDIG≡≥	000524	000404				BR TYPDIG	;Go type it.
≡TYPOCT≠≠MOV≡≡RADIX≡≥	000526	012767	000010	000010	TYPOCT:	MOV #8,RADIX	;To output in base 8.
≠BR≡≡TYPDIG≡≥	000534	000400				BR TYPDIG	;Go type it.
≡TYPDIG≠≠MOV≡≡R0≡≡R1≡≥	000536	010001			TYPDIG:	MOV R0,R1	;Need dividend in R1, with R0 clear.
≠CLR≡≡R0≡≥	000540	005000				CLR R0		;Clear upper half of dividend.
≠DIV≡≡PC≡≡R0≡≥	000542	071027				DIV (PC)+,R0	;Divide argument in R0, R1 by radix.
≡RADIX≠≥	000544	000012			RADIX:	12		;Starts out in decimal.
≠BEQ≡≡TYPOUT≡≥	000546	001404				BEQ TYPOUT	;If quotient zero, then can print.
≠MOV≡≡R1≡≡SP≡≥	000550	010146				MOV R1,-(SP)	;Else stack quotient
≠JSR≡≡PC≡≡TYPDIG≡≥	000552	004767	177760			JSR PC,TYPDIG	;Recursive call.
≠MOV≡≡SP≡≡R1≡≥	000556	012601				MOV (SP)+,R1	;Unstack last quotient
≡TYPOUT≠≠ADD≡≡R1≡≥	000560	062701	000060		TYPOUT:	ADD #'0,R1	;Form TTY code for digit
≠MOV≡≡R1≡≡R0≡≥	000564	010100				MOV R1,R0	;Need argument for TYPCHR in R0.
≡TYPCHR≠≠TSTB≡≡KBOS≡≥	000566	105767	176772		TYPCHR:	TSTB KBOS	;Is TTY available?
≠BPL≡≡TYPCHR≡≥	000572	100375				BPL TYPCHR	;No.  Busy wait for it.
≠MOVB≡≡R0≡≡KBOR≡≥	000574	110067	176766			MOVB R0,KBOR	;Yes.  Output a byte to it.
≠CMP≡≡R0≡≥	000600	022700	000012			CMP #12,R0	;Was it a line feed?
≠BNE≡≡TYPRET≡≥	000604	001007				BNE TYPRET	;If not that code, then done.
≠CLR≡≡R0≡≥	000606	005000				CLR R0		;Otherwise, output 3 nulls.
≠JSR≡≡PC≡≡TYPCHR≡≥	000610	004767	177752			JSR PC,TYPCHR	;
≠JSR≡≡PC≡≡TYPCHR≡≥	000614	004767	177746			JSR PC,TYPCHR	;
≠JSR≡≡PC≡≡TYPCHR≡≥	000620	004767	177742			JSR PC,TYPCHR	;
≡TYPRET≠≠RTS≡≡PC≡≥	000624	000207			TYPRET:	RTS PC		;Return.
≥					
≥					
≠.SBTTL≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 11
	HALIO PAL[HAL,HE]	PAGE 3 	Useful macros for use of I/O routines

≥					.SBTTL Useful macros for use of I/O routines
≥					
≠.MACRO≡≤OUTSTR≠≥					       .MACRO OUTSTR B	;Type string starting at B.
≥						MOV R0,-(SP)	;Save R0.  Who knows what was happening in it?
≥						MOV R1,-(SP)	;Save R1.
≥						MOV #B,R0	;Load up the string to be output
≥						JSR PC,TYPSTR	;Call the string output utility routine.
≥						MOV (SP)+,R1	;Restore R1.
≥						MOV (SP)+,R2	;Restore R2.
≥					       .ENDM
≥					
≠.MACRO≡≤ASCIE≠≥					       .MACRO ASCIE STR
≥					       .ASCIZ STR
≥					       .EVEN
≥					       .ENDM
≥					
≠.MACRO≡≤CRLF≠≥					       .MACRO	CRLF
≥						OUTSTR CRLFX	;Carriage return, line feed.
≥					       .ENDM
≥					
≡CRLFX≠≠.ASCIZ≡≥	000626	   015		
≥	000627	   012			CRLFX: .ASCIZ /
≥	000630	   000		
≥					/
≥					
≡RUGMES≠≤ASCIE≡≥				RUGMES:	ASCIE </π
≥				--YOU'RE UNDER THE RUG
≥					π/>
≠.ASCIZ≡≠.EVEN≡≥					
≠.MACRO≡≤HALERR≠≥					       .MACRO HALERR MES	;Bad error.  Type message, call RUG.
≥						MOV R0,-(SP)	;Save R0.
≥						MOV R1,-(SP)	;Save R1.
≥						MOV #CRLFX,R0	;Move to new line
≥						JSR PC,TYPSTR	;
≥						MOV #MES,R0	;Type out message
≥						JSR PC,TYPSTR	;
≥						MOV #RUGMES,R0	;Type out RUGMES
≥						JSR PC,TYPSTR	;
≥						MOV (SP)+,R1	;Restore R1.
≥						MOV (SP)+,R0	;Restore R2.
≥						JMP RUG		;Go directly to RUG.
≥						BR .-4		;In case we return.
≥					       .ENDM
≥					
≠.MACRO≡≤TTYIN≠≥					       .MACRO TTYIN B	;To read in a word.
≥						TSTB KBIS	;Is keyboard ready?
≥						BEQ .-4		;No.  Busy wait.
≥						MOV KBIR,B	;Yes.  Read a word.
≥						BIC #200,B	;Mask off a bit.
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 12
	HALIO PAL[HAL,HE]	PAGE 3.1 	Useful macros for use of I/O routines

≥					       .ENDM
≥					
≠.INSRT≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 13
	HALRTR PAL[HAL,HE]	PAGE 2.2 	Useful macros for use of I/O routines

≥					.INSRT HALRTR.PAL[HAL,HE]
≠COMMEN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 14
	HALRTR PAL[HAL,HE]	PAGE 1 	Useful macros for use of I/O routines

≥				COMMENT ⊗   VALID 00002 PAGES
≥				C REC  PAGE   DESCRIPTION
≥				C00001 00001
≥				C00002 00002	.SBTTL Free storage management
≥				C00009 ENDMK
≥					C⊗;
≠.SBTTL≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 15
	HALRTR PAL[HAL,HE]	PAGE 2 	Free storage management

≥					.SBTTL Free storage management
≥					
≥					; Assembly variables
≡FREL≠≥		004000			FREL = 4000		;Test of small amount.  Maximum = 40000 (IN WORDS!)
≥					
≥					; Free storage block
≠.EVEN≡≥		000666			.EVEN
≡FREEPT≠≡FREEST≡≡FREEST≡≥	000666	000672			FREEPT:	FREEST
≥	000670	177777				-1		;Left bdry tag is negative.
≡FREEST≠≡FREL≡≡FREL≡≥	000672	010000			FREEST:	FREL*2		;Beginning of free storage.  Boundary tag.
≠.BLKW≡≡FREL≡≥		010670				.BLKW	FREL-2	;
≡FREEND≠≡FREL≡≡FREL≡≥	010670	010000			FREEND:	FREL*2		;End of free storage.  Boundary tag.
≥	010672	177777				-1		;Right bdry tag is negative.
≥					
≥					; Routine to initialize storage.  Need only call if you think
≥					;	storage has been munged, or you want to start over for
≥					;	some reason.
≡FRINIT≠≠MOV≡≡FREL≡≡FREEST≡≥	010674	012767	010000	167770	FRINIT:	MOV #FREL*2,FREEST	;Lower inner tag
≠MOV≡≡FREL≡≡FREEND≡≥	010702	012767	010000	177760		MOV #FREL*2,FREEND	;Upper inner tag
≠MOV≡≡FREEST≡≡FREEPT≡≥	010710	012767	000672	167750		MOV #FREEST,FREEPT	;Roving free pointer
≠CMP≡≡FREEST≡≡FREEND≡≥	010716	026767	167746	177746		CMP FREEST-2,FREEND+2	;Do the two outer tags agree?
≠BNE≡≡FRINER≡≥	010724	001001				BNE FRINER		;No.
≠RTS≡≡PC≡≥	010726	000207				RTS PC			;Yes.  Return.
≡FRINER≠≤HALERR≡≥					FRINER:	HALERR FRINMS
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRINMS≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FRINMS≠≤ASCIE≡≥					FRINMS:	ASCIE /FRINIT FEARS FREE STORAGE HAS BEEN MUNGED/
≠.ASCIZ≡≠.EVEN≡≥					
≥					; Routine to assign storage.  Amount of words requested in R0.
≥					;	Location of first word in block (not the boundary tag) returned
≥					;	in R0.
≥					;  The boundary tag method described in Knuth I.2.5 is
≥					;	used.  Each block of storage has a boundary tag at
≥					;	each end, with identical contents:  The number
≥					;	of bytes in the whole area if available, and the opposite
≥					;	of that if busy.  Artificial busy areas above and below
≥					;	free storage.
≡GTFREE≠≠MOV≡≡R2≡≡SP≡≥	011050	010246			GTFREE:	MOV R2,-(SP)	;Save R2 on stack.
≠ASL≡≡R0≡≥	011052	006300				ASL R0		;Convert words to bytes
≠BLT≡≡FREERR≡≥	011054	002454				BLT FREERR	;Asked for negative number of words.
≠ADD≡≡R0≡≥	011056	062700	000004			ADD #4, R0	;Need 2 extra words for boundary tags
≠MOV≡≡FREEPT≡≡R1≡≥	011062	016701	167600			MOV FREEPT, R1	;R1 ← running LOC[LTAG[*]]
≡FRTRY≠≠CMP≡≡R1≡≡FREEND≡≥	011066	020127	010670		FRTRY:	CMP R1,#FREEND	;Are we off the end of free storage?
≠BLOS≡≡FR2≡≥	011072	101402				BLOS FR2	;No.
≠MOV≡≡FREEST≡≡R1≡≥	011074	012701	000672			MOV #FREEST,R1	;Yes.  Reset pointer to beginning.
≡FR2≠≠CMP≡≡R1≡≡R0≡≥	011100	021100			FR2:	CMP (R1),R0	;Do we have enough room here?
≠BGE≡≡FFOUND≡≥	011102	002011				BGE FFOUND	;Yes
≠TST≡≡R1≡≥	011104	005711				TST (R1)	;No.  Is this area busy?  If so, its count is negative.
≠BGE≡≡FRPOS≡≥	011106	002002				BGE FRPOS	;No.
≠SUB≡≡R1≡≡R1≡≥	011110	161101				SUB (R1),R1	;Yes.  R1 ← LOC[LTAG[next] by subtraction.
≠BR≡≡FR1≡≥	011112	000401				BR  FR1
≡FRPOS≠≠ADD≡≡R1≡≡R1≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 16
	HALRTR PAL[HAL,HE]	PAGE 2.1 	Free storage management

≥	011114	061101			FRPOS:	ADD (R1),R1	;R1 ← LOC[LTAG[next] by addition.
≡FR1≠≠CMP≡≡R1≡≡FREEPT≡≥	011116	020167	167544		FR1:	CMP R1,FREEPT	;Have we cycled all through free storage
≠BEQ≡≡FROVFL≡≥	011122	001454				BEQ FROVFL	;Yes.  No room!
≠BR≡≡FRTRY≡≥	011124	000760				BR  FRTRY	;No.  Try again.
≡FFOUND≠≠BEQ≡≡FEXACT≡≥	011126	001422			FFOUND:	BEQ FEXACT	;If 0, then exact fit.
≠MOV≡≡R1≡≡R2≡≥	011130	010102				MOV R1,R2	;Divide the found block into FOUND and HOLE.
≥								;Thus, R1 = LOC[LTAG[FOUND]].
≠ADD≡≡R0≡≡R2≡≥	011132	060002				ADD R0,R2	;R2 ← LOC[LTAG[HOLE]]
≠NEG≡≡R0≡≥	011134	005400				NEG R0		;R0 ← negative (busy) count of FOUND.
≠MOV≡≡R0≡≡R2≡≥	011136	010062	177776			MOV R0,-2(R2)	;RTAG[FOUND] ← new FOUND count.
≠MOV≡≡R0≡≡SP≡≥	011142	010046				MOV R0,-(SP)	;Save R0.
≠ADD≡≡R1≡≡R0≡≥	011144	061100				ADD (R1),R0	;R0 ← new HOLE count.
≠MOV≡≡R0≡≡R2≡≥	011146	010012				MOV R0,(R2)	;LTAG[HOLE] ← new HOLE count.
≠MOV≡≡R2≡≡FREEPT≡≥	011150	010267	167512			MOV R2,FREEPT	;Free pointer ← LOC[LTAG[HOLE]]
≠MOV≡≡R1≡≡R2≡≥	011154	010102				MOV R1,R2	;
≠TST≡≡R2≡≥	011156	005742				TST -(R2)	;
≠ADD≡≡R1≡≡R2≡≥	011160	061102				ADD (R1),R2	;R2 ← LOC[RTAG[HOLE]].
≠MOV≡≡R0≡≡R2≡≥	011162	010012				MOV R0,(R2)	;RTAG[HOLE] ← new HOLE count.
≠MOV≡≡SP≡≡R1≡≥	011164	012621				MOV (SP)+,(R1)+	;LTAG[FOUND] ← new FOUND count.
≡FRRET≠≠MOV≡≡R1≡≡R0≡≥	011166	010100			FRRET:	MOV R1,R0	;R0 (result) ← LOC[LTAG[FOUND]] + 1.
≠MOV≡≡SP≡≡R2≡≥	011170	012602				MOV (SP)+,R2	;Restore R2
≠RTS≡≡PC≡≥	011172	000207				RTS PC		;Done.
≡FEXACT≠≠MOV≡≡R1≡≡R2≡≥	011174	010102			FEXACT:	MOV R1,R2	;
≠ADD≡≡R1≡≡R2≡≥	011176	061102				ADD (R1),R2	;R2 ← LOC[RTAG[FOUND]]
≠NEG≡≡R1≡≥	011200	005421				NEG (R1)+	;LTAG[FOUND] ← new (busy) count.
≠NEG≡≡R2≡≥	011202	005442				NEG -(R2)	;RTAG[FOUND] ← new (busy) count.
≠BR≡≡FRRET≡≥	011204	000770				BR FRRET	;Ready to return
≡FREERR≠≤HALERR≡≥					FREERR:	HALERR FRMS1
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRMS1≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FROVFL≠≤HALERR≡≥					FROVFL:	HALERR FRMS2
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRMS2≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FRMS1≠≤ASCIE≡≥					FRMS1:	ASCIE </YOU ASKED FOR NEGATIVE AMOUNT OF FREE SPACE/>
≠.ASCIZ≡≠.EVEN≡≡FRMS2≠≤ASCIE≡≥					FRMS2:	ASCIE /FREE STORAGE EXHAUSTED/
≠.ASCIZ≡≠.EVEN≡≥					
≥					
≥					; Routine to release free storage.  R0=LOC[LTAG[BLOCK]] + 1.
≥					; Call the currently released block BLOCK, the adjacent one
≥					;	below LOW, and the adjacent one above HIGH.
≡RLFREE≠≠MOV≡≡R0≡≡R1≡≥	011426	014001			RLFREE:	MOV -(R0),R1	;R1 ← LOC[LTAG[BLOCK]]
≠BGE≡≡RLFER2≡≥	011430	002061				BGE RLFER2	;Can't release available space.
≠MOV≡≡R0≡≡R1≡≥	011432	010001				MOV R0,R1	;R1 ← LOC[LTAG[BLOCK]]
≠SUB≡≡R0≡≡R0≡≥	011434	161000				SUB (R0),R0	;R0 ← LOC[LTAG[HIGH]]
≠CMP≡≡R1≡≡R0≡≥	011436	021160	177776			CMP (R1),-2(R0)	;Do the two bdry tags agree?
≠BNE≡≡RLFER1≡≥	011442	001031				BNE RLFER1	;No.  Storage munged!!
≠NEG≡≡R1≡≥	011444	005411				NEG (R1)	;Count is now positive in LTAG[BLOCK].
≠TST≡≡R1≡≥	011446	005761	177776			TST -2(R1)	;Is LOW available?
≠BLT≡≡MERGR≡≥	011452	002411				BLT MERGR	;No.  Cannot merge left.
≠ADD≡≡R1≡≡R1≡≥	011454	066111	177776			ADD -2(R1),(R1)	;Yes.  LTAG[BLOCK] ← New count
≠MOV≡≡R1≡≡R0≡≥	011460	011160	177776			MOV (R1),-2(R0)	;RTAG[BLOCK] ← New count
≠MOV≡≡R0≡≡R1≡≥	011464	010001				MOV R0,R1	;
≠SUB≡≡R1≡≡R1≡≥	011466	166101	177776			SUB -2(R1),R1	;R1 ← LOC[LTAG[LOW]]
≠MOV≡≡R0≡≡R1≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 17
	HALRTR PAL[HAL,HE]	PAGE 2.2 	Free storage management

≥	011472	016011	177776			MOV -2(R0),(R1)	;LTAG[LOW] ← New count
≥								;At this point, call LOW&BLOCK = BLOCK.
≡MERGR≠≠TST≡≡R0≡≥	011476	005710			MERGR:	TST (R0)	;Is HIGH available?
≠BLT≡≡RLRET≡≥	011500	002407				BLT RLRET	;No.  Prepare to return.
≠ADD≡≡R0≡≡R1≡≥	011502	061011				ADD (R0),(R1)	;LTAG[BLOCK] ← New count
≠CMP≡≡FREEPT≡≡R0≡≥	011504	026700	167156			CMP FREEPT,R0	;Will FREEPT point into a vacuum?
≠BNE≡≡RL1≡≥	011510	001002				BNE RL1		;No.
≠MOV≡≡R1≡≡FREEPT≡≥	011512	010167	167150			MOV R1,FREEPT	;Yes.  Reset FREEPT ← LOC[LTAG[BLOCK]]
≡RL1≠≠ADD≡≡R0≡≡R0≡≥	011516	061000			RL1:	ADD (R0),R0	;R0 ← LOC[RTAG[HIGH]] + 1
≥								;At this point, call BLOCK&HIGH = BLOCK.
≡RLRET≠≠MOV≡≡R1≡≡R0≡≥	011520	011160	177776		RLRET:	MOV (R1),-2(R0)	;RTAG[BLOCK] ← New count
≠RTS≡≡PC≡≥	011524	000207				RTS PC		;Done.
≡RLFER1≠≤HALERR≡≥					RLFER1:	HALERR RLMS1
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RLMS1≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡RLFER2≠≤HALERR≡≥					RLFER2:	HALERR RLMS2
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RLMS2≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡RLMS1≠≤ASCIE≡≥					RLMS1:	ASCIE /RLFREE FEARS FREE STORAGE IS WIPED OUT/
≠.ASCIZ≡≠.EVEN≡≡RLMS2≠≤ASCIE≡≥					RLMS2:	ASCIE /ATTEMPT TO FREE ALREADY AVAILABLE SPACE/
≠.ASCIZ≡≠.EVEN≡≠.INSRT≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 18
	SMALLB PAL[HAL,HE]	PAGE 2.2 	Free storage management

≥					.INSRT SMALLB.PAL[HAL,HE]
≠COMMEN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 19
	SMALLB PAL[HAL,HE]	PAGE 1 	Free storage management

≥				COMMENT ⊗   VALID 00014 PAGES
≥				C REC  PAGE   DESCRIPTION
≥				C00001 00001
≥				C00002 00002	.SBTTL SMALL BLOCK ALLOCATOR
≥				C00006 00003	SMALL BLOCK DESCRIPTOR FORMAT
≥				C00009 00004	ROUTINE MAPPTR,<ROUT>	
≥				C00012 00005	ROUTINE MARKPH		
≥				C00014 00006	ROUTINE CPFYSP,<SPC>
≥				C00018 00007	ROUTINE CPFY
≥				C00019 00008	ROUTINE SWEEP
≥				C00022 00009	ROUTINE GC
≥				C00023 00010	GETSBK & GETBLK
≥				C00026 00011	FREBLK & FRESBK
≥				C00028 00012	ROUTINE NEWSPC,<SZ,IDF,NPB,GCF,NMN,NPC>
≥				C00030 00013	ROUTINE ADDBUF,<SPACE>
≥				C00032 00014	ROUTINE FSINI
≥				C00034 ENDMK
≥					C⊗;
≠.SBTTL≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 20
	SMALLB PAL[HAL,HE]	PAGE 2 	SMALL BLOCK ALLOCATOR

≥					.SBTTL SMALL BLOCK ALLOCATOR
≥					;Coded by RHT 9-Sept-1974
≥					
≡SMBDBG≠≥		000001			SMBDBG == 1	;WE ARE DEBUGGING
≥					
≥					; Overview:
≥					;	The basic idea is to break up large blocks of storage
≥					;into smaller, fixed size blocks, and then administer them.
≥					;The routines given here provide a facility whereby a user
≥					;can have a number of different "spaces" of fixed size blocks.
≥					;Each space is described by an approximately 10 word descriptor
≥					;block.  All these descriptor blocks are linked together on
≥					;a big chain (SIDLST), and each space is assumed to have
≥					;asociated with it a unique 8-bit number (thus allowing up to
≥					;256 spaces).  Each space descriptor owns a linked list
≥					;of buffers, with each buffer containing a number of blocks.
≥					;Each space may be either collectable or uncollectable.
≥					;Any block may be released explicitly, although if the
≥					;space is collectable, this may be unwise.  Also, collectable
≥					;spaces are compactified by the garbage collector.
≥					;As an efficiency measure, the first few indices (now, 1-10)
≥					;are also kept in a table (SIDTBL).
≥					;
≥					;Blocks are allocated by the routines GETBLK & GETSBK:
≥					;
≥					;	MOV	#IDCODE,R0	;IDCODE IS THE 8-BIT CODE FOR A 
≥					;	JSR	PC,GETBLK	;SPACE
≥					;
≥					;	MOV	#SPCDSC,R0	;SPCDSC IS ADDRESS OF THE SPACE 
≥					;	JSR	PC,GETSBK	;DESCRIPTOR
≥					;
≥					;In either case, a pointer to a new block is returned in R0.
≥					;If need be, the free space routine will call the garbage collector
≥					;to get more space or (if the space is not collectable or
≥					;garbage collection is disabled) it will call the large block
≥					;routines to get another buffer.  If garbage collection fails
≥					;to produce a goodly surplus of blocks for some space, then
≥					;additional buffers of new blocks will be obtained.
≥					;
≥					;Each small block has the following format:
≥					;		tag,,id		;tag is used in garbage collecting
≥					;	r0 →→	word 0		;this is the word pointed to by getblk
≥					;		:
≥					;		word n
≥					;
≥					;blocks are zeroed before being returned.  Although this is sometimes
≥					;a bit extra overhead, it does prevent bugs and avoids the necessity
≥					;for explicit clears all over the place.
≥					;
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 21
	SMALLB PAL[HAL,HE]	PAGE 2.1 	SMALL BLOCK ALLOCATOR

≥					;Blocks are freed by the routines FREBLK & FRESBK:
≥					;
≥					;	MOV	BLOCK,R0	;POINT AT BLOCK TO KILL
≥					;	JSR	PC,FREBLK
≥					;
≥					;	MOV	BLOCK,R0	;POINT AT BLOCK TO KILL
≥					;	MOV	#SPCDSC,R1	;R1 POINTS AT SPACE DESCRIPTOR
≥					;	JSR	PC,FRESBK
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 22
	SMALLB PAL[HAL,HE]	PAGE 3 	SMALL BLOCK ALLOCATOR

≥					;SMALL BLOCK DESCRIPTOR FORMAT
≥					
≡II≠≥		000000				II == 0
≤XX≡≥						XX	IDFLAG	;ACTUALLY A BYTE -- GETS PUT IN ID PART OF TAG WORD
≡II≡≡IDFLAG≠≡II≡≡II≠≤XX≡≥						XX	MAPRTN	;ROUTINE TO BE CALLED ON MARK
≡II≡≡MAPRTN≠≡II≡≡II≠≤XX≡≥						XX	SIZE	;How many words for a value cell in this type block.
≡II≡≡SIZE≠≡II≡≡II≠≤XX≡≥						XX	NPERB	;NUMBER OF BLOCKS PER BUFFER
≡II≡≡NPERB≠≡II≡≡II≠≤XX≡≥						XX	GCFG	;SET IF THIS IS NOT A COLLECTABLE AREA
≡II≡≡GCFG≠≡II≡≡II≠≤XX≡≥						XX	NMIN	;MIN NUMBER OF FREE BLOCKS TO BE RETURNED BY GC
≡II≡≡NMIN≠≡II≡≡II≠≤XX≡≥						XX	NPCT	;MIN % OF FREE BLOCKS TO BE RETURNED BY GC
≡II≡≡NPCT≠≡II≡≡II≠≤XX≡≥						XX	NXTSID	;NEXT BLOCK ON ID CHAIN 
≡II≡≡NXTSID≠≡II≡≡II≠≤XX≡≥						XX	FFREE	;FREE LIST
≡II≡≡FFREE≠≡II≡≡II≠≤XX≡≥						XX	FSTBUF	;OLDEST BUFFER
≡II≡≡FSTBUF≠≡II≡≡II≠≤XX≡≥						XX	LSTBUF	;NEWEST BUFFER
≡II≡≡LSTBUF≠≡II≡≡II≠≤XX≡≥						XX	NALLOC	;NUMBER ALLOCATED
≡II≡≡NALLOC≠≡II≡≡II≠≤XX≡≥						XX	NFREE	;NUMBER FREE
≡II≡≡NFREE≠≡II≡≡II≠≡II≡≡SPCHDR≠≥		000032				SPCHDR == II
≥					
≥					;; EACH BUFFER
≡II≠≥		000000				II == 0
≤XX≡≥						XX	NXTBUF	;NEXT BUFFER
≡II≡≡NXTBUF≠≡II≡≡II≠≤XX≡≥						XX	PRVBUF	;PREVIOUS BUFFER
≡II≡≡PRVBUF≠≡II≡≡II≠≤XX≡≥						XX	LSTBLK	;ADDRESS OF LAST BLOCK IN THIS BUFFER
≡II≡≡LSTBLK≠≡II≡≡II≠≤XX≡≥						XX	FSTBLK	;POINTS AT FIRST LOCN
≡II≡≡FSTBLK≠≡II≡≡II≠≡II≡≡BUFHDR≠≥		000010				BUFHDR == II
≥					
≥					;; EACH BLOCK
≡II≠≥		000000				II == 0
≡TAG≠≥		177777				TAG == -1	;≠0 MEANS INUSE (USED IN GC)
≡TAGID≠≥		177776				TAGID == -2	;USED TO HOLD AN "ID" FOR THIS RECORD
≤XX≡≥						XX	WORD0	;FIRST DATA WORD
≡II≡≡WORD0≠≡II≡≡II≠≥					
≥					;;GC METHODS
≡II≠≥		000000				II == 0
≤XX≡≥						XX	METH	;ROUTINE TO CALL
≡II≡≡METH≠≡II≡≡II≠≤XX≡≥						XX	NXTMTH	;NEXT ON CHAIN
≡II≡≡NXTMTH≠≡II≡≡II≠≥					
≠.MACRO≡≤MMETH≠≥					.MACRO MMETH ROUT
≥						ROUT
≥						0
≥					.ENDM
≥					
≥					;;SPECIAL SPACES
≥					
≡SIDCNT≠≥		000000			SIDCNT == 0;
≥					
≠.MACRO≡≤SPC≠≥					.MACRO SPC ID,MMRT,SZ,NPB,GCF,NMN,NPC
≥					    .IFNDF ID
≥						SIDCNT==SIDCNT+1
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 23
	SMALLB PAL[HAL,HE]	PAGE 3.1 	SMALL BLOCK ALLOCATOR

≥						ID==SIDCNT
≥					    .ENDC
≥						ID	;IDFLAG
≥						MMRT	;MAPRTN
≥						SZ	;SIZE
≥						NPB	;NPERB
≥						GCF	;GCFG
≥						NMN	;NMIN
≥						NPC	;NPCT
≥						0	;NXTSID
≥						0	;FFREE
≥						0	;FSTBUF
≥						0	;LSTBUF
≥						0	;NALLOC
≥						0	;NFREE
≥					.ENDM
≥					
≡MAXIDF≠≥		000010			MAXIDF == 10	;MAX INDEX INTO SIDTBL
≥					
≡VCTSPC≠≤SPC≡≥					VCTSPC:	SPC	VCTID,MKRTJM,4,10,1,4,15
≠.IFNDF≡≡VCTID≡≡VCTID≡≡VCTID≡≡MKRTJM≡≡MKRTJM≡≥					
≥					
≡MMETHS≠≥	012014	000000			MMETHS:	0			;OWNS A LIST OF MARKING METHODS
≡GCOK≠≥	012016	000000			GCOK:	0			;SET IF GC IS OK NOW
≡CPFYOK≠≥	012020	000000			CPFYOK:	0			;SET IF COMPACTIFICATION IS OK
≡SIDLST≠≥	012022	000000			SIDLST:	0			;LIST OF SPACE ID BLOCKS
≡SIDTBL≠≥	012024	000000			SIDTBL:	0
≠.BLKW≡≡MAXIDF≡≥		012046				.BLKW MAXIDF
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 24
	SMALLB PAL[HAL,HE]	PAGE 4 	SMALL BLOCK ALLOCATOR

≥					ROUTINE MAPPTR,<ROUT>	
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡ROUT≠≡NNNN≡≡NNNN≠≡MAPPTR≠≥					;;
≥					;;ROUT TAKES A SINGLE PARAMETER (IN R0) WHICH IS A POINTER
≥					;;	TO  A SMALL BLOCK.  IT RETURNS (IN R0) A POINTER VALUE
≥					;;	WHICH IS TO BE STORED BACK IN THE POINTER CELL.
≥					;;
≥					
≥					;; MAPPTR RUNS DOWN A LIST OF "MARKING METHODS" (MMETHS)
≥					;; EACH METHOD IS ASSUMED TO BE RESPONSIBLE FOR SOME
≥					;; BATCH OF POINTERS.  FOR EACH POINTER IT FINDS, A 
≥					;; METHOD SHOULD CALL THE ROUTINE MARKR0 (VIA JSR PC)
≥					;; IE, EACH MARKING METHOD SHOULD HAVE THE FORM
≥					;;	METH:	R←#<first pointer>
≥					;;		WHILE R≠NULL DO
≥					;;			BEGIN
≥					;;			R0←(R);
≥					;;			JSR PC,MARKR0;
≥					;;			(R)←R0;
≥					;;			R←#<next pointer>;
≥					;;			END;
≥					;;		RETURN;
≥					;;
≥					;; MARKR0 DETERMINES THE TYPE OF THE RECORD (IE FINDS ITS SPACE
≥					;; DESCRIPTOR.  IT THEN DOES A 
≥					;;		JSR	PC,@MAPRTN(<space>)
≥					;; FOR SPACES WHERE THERE ARE NO POINTER SUBFIELDS, THIS MAY BE JUST
≥					;; MKRTJM (IE A JMP @ROUT(RF) ).  IF THERE ARE POINTER SUBFIELDS, THEN
≥					;; THE MAPRTN NEEDS TO BE MORE COMPLICATED:
≥					;;
≥					;;		IF TAG(R0) THEN RTS PC;
≥					;;		JSR	PC,@ROUT(RF);
≥					;;		PUSH R;
≥					;;		R←R0;
≥					;;		∀ R0 | R0 is a pointer subfield of R DO
≥					;;			JSR	PC,MARKR0;
≥					;;		R0←R;
≥					;;		POP R;
≥					;;		RTS PC;
≥					;;
≥					
≥					;;MAPPTR:	;(IN CASE YOU HAD FORGOTTEN)
≠MOV≡≡R2≡≡SP≡≥	012046	010246				MOV	R2,-(SP)	;
≠MOV≡≡MMETHS≡≡R2≡≥	012050	016702	177740			MOV	MMETHS,R2	;LIST OF MARKING METHS
≠BEQ≡≡MAPRTS≡≥	012054	001413				BEQ	MAPRTS		;DONE??
≡MAPLP≠≤CALL≡≥					MAPLP:	CALL	@METH(R2),<ROUT(RF)>
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡ROUT≡≡RF≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡METH≡≡R2≡≠MOV≡≡NXTMTH≡≡R2≡≡R2≡≥	012076	016202	000002			MOV	NXTMTH(R2),R2	;NEXT METHOD
≠BNE≡≡MAPLP≡≥	012102	001365				BNE	MAPLP		;ITERATE
≡MAPRTS≠≠MOV≡≡SP≡≡R2≡≥	012104	012602			MAPRTS:	MOV	(SP)+,R2	;
≠RTS≡≡RF≡≥	012106	000205				RTS	RF		;RETURN
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 25
	SMALLB PAL[HAL,HE]	PAGE 4.1 	SMALL BLOCK ALLOCATOR

≥					
≡MKRTJM≠≠JMP≡≡ROUT≡≡RF≡≥	012110	000175	000002		MKRTJM:	JMP	@ROUT(RF)	;THIS IS THE APPROPRIATE 
≥									;MARKING INTRINSIC FOR CASES WHERE
≥									;THERE ARE NO POINTER SUBFIELDS
≥					
≡MARKR0≠≠JSR≡≡PC≡≡PTRSID≡≥	012114	004767	001446		MARKR0:	JSR	PC,PTRSID	;GETS SPACE DESCRIPTOR INTO R1
≠JSR≡≡PC≡≡MAPRTN≡≡R1≡≥	012120	004771	000002			JSR	PC,@MAPRTN(R1)	;CALL APPROPRIATE MARKING INTRINSIC
≠RTS≡≡PC≡≥	012124	000207				RTS	PC
≥					
≥					;THE NEXT ROUTINE IS USED TO ADD A METHOD TO THE "MMETHS" LIST
≡LNKMTH≠≠MOV≡≡MMETHS≡≡NXTMTH≡≡R0≡≥	012126	016760	177662	000002	LNKMTH:	MOV	MMETHS,NXTMTH(R0)
≠MOV≡≡R0≡≡MMETHS≡≥	012134	010067	177654			MOV	R0,MMETHS
≠RTS≡≡PC≡≥	012140	000207				RTS	PC
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 26
	SMALLB PAL[HAL,HE]	PAGE 5 	SMALL BLOCK ALLOCATOR

≥					ROUTINE MARKPH		
≠.IFNB≡≡MARKPH≠≠MOV≡≡R2≡≡SP≡≥	012142	010246				MOV	R2,-(SP)	;
≠MOV≡≡R3≡≡SP≡≥	012144	010346				MOV	R3,-(SP)	;
≠MOV≡≡SIDLST≡≡R2≡≥	012146	016702	177650			MOV	SIDLST,R2	;ALL SIZES
≠BEQ≡≡MKPHRT≡≥	012152	001440				BEQ	MKPHRT		;DONE ALREADY??
≡MKPH.1≠≠TST≡≡GCFG≡≡R2≡≥	012154	005762	000010		MKPH.1:	TST	GCFG(R2)	;A GC SPACE??
≠BEQ≡≡MKPH.A≡≥	012160	001422				BEQ	MKPH.AD		;NO, GO ON TO NEXT
≠MOV≡≡SIZE≡≡R2≡≡R3≡≥	012162	016203	000004			MOV	SIZE(R2),R3	;
≠INC≡≡R3≡≥	012166	005203				INC	R3		;ONE FOR TAG WORD
≠ASL≡≡R3≡≥	012170	006303				ASL	R3		;WORDS TO BYTES
≠MOV≡≡FSTBUF≡≡R2≡≡R1≡≥	012172	016201	000022			MOV	FSTBUF(R2),R1	;CLEAR THIS BUFFER
≡MKP.02≠≠MOV≡≡FSTBLK≡≡R1≡≡R0≡≥	012176	016100	000006		MKP.02:	MOV	FSTBLK(R1),R0	;FIRST BLOCK
≡MKPH.2≠≠CMP≡≡R0≡≡LSTBLK≡≡R1≡≥	012202	020061	000004		MKPH.2:	CMP	R0,LSTBLK(R1)	;DONE THIS BUFFER?
≠BGT≡≡MKPH.3≡≥	012206	003004				BGT	MKPH.3		;IF SO, GO ON TO NEXT
≠CLRB≡≡TAG≡≡R0≡≥	012210	105060	177777			CLRB	TAG(R0)		;CLEAR TAG
≠ADD≡≡R3≡≡R0≡≥	012214	060300				ADD	R3,R0		;BUMP POINTER TO NEXT
≠BR≡≡MKPH.2≡≥	012216	000771				BR	MKPH.2		;ITERATE
≡MKPH.3≠≠MOV≡≡NXTBUF≡≡R1≡≡R1≡≥	012220	016101	000000		MKPH.3:	MOV	NXTBUF(R1),R1	;ON TO NEXT BUFFER
≠BNE≡≡MKP.02≡≥	012224	001364				BNE	MKP.02		;IF WE HAVE ONE
≡MKPH.A≠≠MOV≡≡NXTSID≡≡R2≡≡R2≡≥	012226	016202	000016		MKPH.AD:MOV	NXTSID(R2),R2	;GO ON TO NEXT SPACE
≠BNE≡≡MKPH.1≡≥	012232	001350				BNE	MKPH.1		;
≥					
≤CALL≡≥						CALL	MAPPTR,<#MKROUT> ;DO THE ACTUAL MARKING
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡MKROUT≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡MAPPTR≡≥						
≡MKPHRT≠≠MOV≡≡SP≡≡R3≡≥	012254	012603			MKPHRT:	MOV	(SP)+,R3	;RESTORE
≠MOV≡≡SP≡≡R2≡≥	012256	012602				MOV	(SP)+,R2
≠RTS≡≡RF≡≥	012260	000205				RTS	RF
≥					
≡MKROUT≠≠MOVB≡≡TAG≡≡R0≡≥	012262	112760	000377	177777	MKROUT:	MOVB	#377,TAG(R0)	;
≠RTS≡≡PC≡≥	012270	000207				RTS	PC		;
≥					
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 27
	SMALLB PAL[HAL,HE]	PAGE 6 	SMALL BLOCK ALLOCATOR

≥					ROUTINE CPFYSP,<SPC>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPC≠≡NNNN≡≡NNNN≠≡CPFYSP≠≥					;;
≥					;; PERFORMS ALL DATA MOVING REQUIRED TO COMPACTIFY ONE SIZE SPACE
≥					;;
≠MOV≡≡R2≡≡SP≡≥	012272	010246				MOV	R2,-(SP)	;SAVE SOME ACS
≠MOV≡≡R3≡≡SP≡≥	012274	010346				MOV	R3,-(SP)	;
≠MOV≡≡R4≡≡SP≡≥	012276	010446				MOV	R4,-(SP)	;
≠MOV≡≡SPC≡≡RF≡≡R2≡≥	012300	016502	000002			MOV	SPC(RF),R2	;SPACE DSCR
≠MOV≡≡FSTBUF≡≡R2≡≡R3≡≥	012304	016203	000022			MOV	FSTBUF(R2),R3	;OLDEST
≠MOV≡≡LSTBUF≡≡R2≡≡R4≡≥	012310	016204	000024			MOV	LSTBUF(R2),R4	;NEWEST
≠JSR≡≡PC≡≡NXF.0≡≥	012314	004767	000100			JSR	PC,NXF.0	;NEXT FREE INTO 1
≥									;MAY MODIFY R3
≠BEQ≡≡CPFY.2≡≥	012320	001433				BEQ	CPFY.2		;NO FREE
≠JSR≡≡PC≡≡NXR.0≡≥	012322	004767	000144			JSR	PC,NXR.0	;GET A RECORD TO MOVE
≥									;INTO R1 (MAY MUNCH R0)
≠BEQ≡≡CPFY.2≡≥	012326	001430				BEQ	CPFY.2		;
≡CPFY.1≠≠MOV≡≡R1≡≡SP≡≥	012330	010146			CPFY.1:	MOV	R1,-(SP)	;SAVE THESE
≠MOV≡≡R0≡≡SP≡≥	012332	010046				MOV	R0,-(SP)	;
≠MOVB≡≡TAG≡≡R0≡≥	012334	112760	000377	177777		MOVB	#377,TAG(R0)	;
≠CLRB≡≡TAG≡≡R1≡≥	012342	105061	177777			CLRB	TAG(R1)		;
≠MOV≡≡SIZE≡≡R2≡≡R2≡≥	012346	016202	000004			MOV	SIZE(R2),R2	;
≡CPYR≠≠MOV≡≡R1≡≡R0≡≥	012352	012120			CPYR:	MOV	(R1)+,(R0)+	;COPY RECORD
≠DEC≡≡R2≡≥	012354	005302				DEC	R2		;COUNT DOWN
≠BGT≡≡CPYR≡≥	012356	003375				BGT	CPYR		;DONE??
≠MOV≡≡SPC≡≡RF≡≡R2≡≥	012360	016502	000002			MOV	SPC(RF),R2	;YES
≠MOV≡≡SP≡≡R0≡≥	012364	012600				MOV	(SP)+,R0	;GET ACS BACK
≠MOV≡≡SP≡≡R1≡≥	012366	012601				MOV	(SP)+,R1	;
≠MOV≡≡R0≡≡WORD0≡≡R1≡≥	012370	010061	000000			MOV	R0,WORD0(R1)	;POINT AT THIS ONE
≠JSR≡≡PC≡≡NXF.NX≡≥	012374	004767	000032			JSR	PC,NXF.NX	;NEXT FREE
≠BEQ≡≡CPFY.2≡≥	012400	001403				BEQ	CPFY.2
≠JSR≡≡PC≡≡NXR.NX≡≥	012402	004767	000076			JSR	PC,NXR.NX	;NEXT RECORD
≠BNE≡≡CPFY.1≡≥	012406	001350				BNE	CPFY.1		;PROCESS THAT ONE
≡CPFY.2≠≥					CPFY.2:
≠MOV≡≡SP≡≡R4≡≥	012410	012604				MOV	(SP)+,R4	;
≠MOV≡≡SP≡≡R3≡≥	012412	012603				MOV	(SP)+,R3	;
≠MOV≡≡SP≡≡R2≡≥	012414	012602				MOV	(SP)+,R2
≠RTS≡≡RF≡≥	012416	000205				RTS	RF
≥					
≡NXF.0≠≠MOV≡≡FSTBLK≡≡R3≡≡R0≡≥	012420	016300	000006		NXF.0:	MOV	FSTBLK(R3),R0	;FIND A FREE BLOCK
≡NXF.1≠≠TSTB≡≡TAG≡≡R0≡≥	012424	105760	177777		NXF.1:	TSTB	TAG(R0)		;FREE
≠BEQ≡≡NXF.4≡≥	012430	001416				BEQ	NXF.4		;YES
≡NXF.NX≠≠ADD≡≡SIZE≡≡R2≡≡R0≡≥	012432	066200	000004		NXF.NX:	ADD	SIZE(R2),R0	;LOOK AT NEXT
≠ADD≡≡SIZE≡≡R2≡≡R0≡≥	012436	066200	000004			ADD	SIZE(R2),R0	;ADD TWICE SINCE WANT TRUE ADDRESS
≠TST≡≡R0≡≥	012442	005720				TST	(R0)+		;ADD IN TAG WORD OFFSET
≠CMP≡≡R0≡≡LSTBLK≡≡R3≡≥	012444	020063	000004			CMP	R0,LSTBLK(R3)	;MORE TO TRY??
≠BLE≡≡NXF.1≡≥	012450	003765				BLE	NXF.1		;TRY AGAIN
≠MOV≡≡NXTBUF≡≡R3≡≡R3≡≥	012452	016303	000000			MOV	NXTBUF(R3),R3	;NEXT NEWEST BUFFER
≠BEQ≡≡NXF.3≡≥	012456	001402				BEQ	NXF.3		;LOOK THERE
≠CMP≡≡R3≡≡R4≡≥	012460	020304				CMP	R3,R4		;IF NOT TO THE R SUPPLIER
≠BNE≡≡NXF.0≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 28
	SMALLB PAL[HAL,HE]	PAGE 6.1 	SMALL BLOCK ALLOCATOR

≥	012462	001356				BNE	NXF.0
≡NXF.3≠≠CLR≡≡R0≡≥	012464	005000			NXF.3:	CLR	R0
≡NXF.4≠≠MOV≡≡R0≡≡R0≡≥	012466	010000			NXF.4:	MOV	R0,R0		;GET FLAGS CORRECT
≠RTS≡≡PC≡≥	012470	000207				RTS	PC
≥					
≥					
≡NXR.0≠≠MOV≡≡FSTBLK≡≡R4≡≡R0≡≥	012472	016400	000006		NXR.0:	MOV	FSTBLK(R4),R0	;FIND A FULL BLOCK
≡NXR.1≠≠TSTB≡≡TAG≡≡R0≡≥	012476	105760	177777		NXR.1:	TSTB	TAG(R0)		;FULL
≠BNE≡≡NXF.4≡≥	012502	001371				BNE	NXF.4		;YES
≡NXR.NX≠≠ADD≡≡SIZE≡≡R2≡≡R0≡≥	012504	066200	000004		NXR.NX:	ADD	SIZE(R2),R0	;LOOK AT NEXT
≠ADD≡≡SIZE≡≡R2≡≡R0≡≥	012510	066200	000004			ADD	SIZE(R2),R0	;ADD TWICE SINCE WANT TRUE ADDRESS
≠TST≡≡R0≡≥	012514	005720				TST	(R0)+		;ADD IN TAG WORD OFFSET
≠CMP≡≡R0≡≡LSTBLK≡≡R4≡≥	012516	020064	000004			CMP	R0,LSTBLK(R4)	;MORE TO TRY??
≠BLE≡≡NXR.1≡≥	012522	003765				BLE	NXR.1		;TRY AGAIN
≠MOV≡≡PRVBUF≡≡R4≡≡R4≡≥	012524	016404	000002			MOV	PRVBUF(R4),R4	;NEXT NEWEST BUFFER
≠BEQ≡≡NXR.3≡≥	012530	001402				BEQ	NXR.3		;LOOK THERE
≠CMP≡≡R3≡≡R4≡≥	012532	020304				CMP	R3,R4		;IF NOT TO THE R SUPPLIER
≠BNE≡≡NXF.0≡≥	012534	001331				BNE	NXF.0
≡NXR.3≠≠CLR≡≡R0≡≥	012536	005000			NXR.3:	CLR	R0
≡NXR.4≠≠MOV≡≡R0≡≡R0≡≥	012540	010000			NXR.4:	MOV	R0,R0		;GET FLAGS CORRECT
≠RTS≡≡PC≡≥	012542	000207				RTS	PC
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 29
	SMALLB PAL[HAL,HE]	PAGE 7 	SMALL BLOCK ALLOCATOR

≥					ROUTINE CPFY
≠.IFNB≡≡CPFY≠≠MOV≡≡R2≡≡SP≡≥	012544	010246				MOV	R2,-(SP)	
≠MOV≡≡SIDLST≡≡R2≡≥	012546	016702	177250			MOV	SIDLST,R2	;LIST OF ALL SIZES
≠BEQ≡≡CPFYXX≡≥	012552	001415				BEQ	CPFYXX		;NULL LIST??
≡CPFYLP≠≠TST≡≡GCFG≡≡R2≡≥	012554	005762	000010		CPFYLP:	TST	GCFG(R2)	;COLLECTABLE??
≠BEQ≡≡CPFYNX≡≥	012560	001407				BEQ	CPFYNX		;BR IF NOT
≤CALL≡≥						CALL	CPFYSP,<R2>	;COMPACTIFY THIS SPACE
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R2≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡CPFYSP≡≡CPFYNX≠≠MOV≡≡NXTSID≡≡R2≡≡R2≡≥	012600	016202	000016		CPFYNX:	MOV	NXTSID(R2),R2
≠BNE≡≡CPFYLP≡≥	012604	001363				BNE	CPFYLP
≡CPFYXX≠≤CALL≡≥					CPFYXX:	CALL	MAPPTR,<#MUNLNK> ;MUNCH ALL LINKS
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡MUNLNK≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡MAPPTR≡≥						; **** HERE IS THE SPOT WHERE YOU SHOULD WORRY ABOUT
≥						;      GETTING RID OF EXCESS BUFFER BLOCKS ****
≡CPFYRT≠≠MOV≡≡SP≡≡R2≡≥	012626	012602			CPFYRT:	MOV	(SP)+,R2	;RETURN
≠RTS≡≡RF≡≥	012630	000205				RTS	RF
≥					
≡MUNLNK≠≠MOV≡≡R0≡≡R1≡≥	012632	011001			MUNLNK:	MOV	(R0),R1		;CALLED WITH R0 →→ A PTR
≠TST≡≡TAG≡≡R1≡≥	012634	005761	177777			TST	TAG(R1)		;DID WE MOVE IT ??
≠BNE≡≡MUNRTS≡≥	012640	001002				BNE	MUNRTS		;
≠MOV≡≡WORD0≡≡R1≡≡R0≡≥	012642	016110	000000			MOV	WORD0(R1),(R0)	;YES, PUT NEW POINTER IN PLACE
≡MUNRTS≠≠RTS≡≡PC≡≥	012646	000207			MUNRTS:	RTS	PC		;
≥					
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 30
	SMALLB PAL[HAL,HE]	PAGE 8 	SMALL BLOCK ALLOCATOR

≥					ROUTINE SWEEP
≠.IFNB≡≡SWEEP≠≠MOV≡≡R2≡≡SP≡≥	012650	010246				MOV	R2,-(SP)	;
≠MOV≡≡SIDLST≡≡R2≡≥	012652	016702	177144			MOV	SIDLST,R2	;LIST OF SIZES
≠BEQ≡≡SWP.X≡≥	012656	001405				BEQ	SWP.X
≡SWP.LP≠≠JSR≡≡PC≡≡SWP.≡≥	012660	004767	000030		SWP.LP:	JSR	PC,SWP.		;GO SWEEP ONE AREA
≠MOV≡≡NXTSID≡≡R2≡≡R2≡≥	012664	016202	000016			MOV	NXTSID(R2),R2	;ITERATE
≠BNE≡≡SWP.LP≡≥	012670	001373				BNE	SWP.LP		;
≡SWP.X≠≠MOV≡≡SP≡≡R2≡≥	012672	012602			SWP.X:	MOV	(SP)+,R2	;
≠RTS≡≡RF≡≥	012674	000205				RTS	RF		;
≥					
≤ROUTIN≡≥					ROUTINE SWEEP1,<SPCC>	
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPCC≠≡NNNN≡≡NNNN≠≡SWEEP1≠≠MOV≡≡R2≡≡SP≡≥	012676	010246				MOV	R2,-(SP)	;SAVE REGISTERS
≠MOV≡≡SPCC≡≡RF≡≡R2≡≥	012700	016502	000002			MOV	SPCC(RF),R2	;GET A SPACE
≠JSR≡≡PC≡≡SWP.≡≥	012704	004767	000004			JSR	PC,SWP.		;SWEEP ONE AREA
≡SWP.XX≠≠MOV≡≡SP≡≡R2≡≥	012710	012602			SWP.XX:	MOV	(SP)+,R2	
≠RTS≡≡RF≡≥	012712	000205				RTS	RF
≥					
≡SWP.≠≠TST≡≡GCFG≡≡R2≡≥	012714	005762	000010		SWP.:	TST	GCFG(R2)	;IS THIS SPACE FOR SWEEPING??
≠BNE≡≡SWP.00≡≥	012720	001001				BNE	SWP.00		;
≠RTS≡≡PC≡≥	012722	000207				RTS	PC		;NO
≡SWP.00≠≠MOV≡≡R3≡≡SP≡≥	012724	010346			SWP.00:	MOV	R3,-(SP)	;YES
≠MOV≡≡R4≡≡SP≡≥	012726	010446				MOV	R4,-(SP)	;
≠CLR≡≡FFREE≡≡R2≡≥	012730	005062	000020			CLR	FFREE(R2)	;WILL BUILD A REAL FREE LIST
≠CLR≡≡NFREE≡≡R2≡≥	012734	005062	000030			CLR	NFREE(R2)	;SINCE WE WILL FIX COUNTS
≠CLR≡≡NALLOC≡≡R2≡≥	012740	005062	000026			CLR	NALLOC(R2)	;
≠MOV≡≡FSTBUF≡≡R2≡≡R3≡≥	012744	016203	000022			MOV	FSTBUF(R2),R3	;OLDEST BUFFER
≠BEQ≡≡SWP.3≡≥	012750	001432				BEQ	SWP.3		;IF ANY
≠MOV≡≡SIZE≡≡R2≡≡R4≡≥	012752	016204	000004			MOV	SIZE(R2),R4	;COMPUTE SIZE
≠INC≡≡R4≡≥	012756	005204				INC	R4		;IN BYTES OF WHOLE THING
≠ASL≡≡R4≡≥	012760	006304				ASL	R4		;
≡SWP.01≠≠MOV≡≡FSTBLK≡≡R3≡≡R0≡≥	012762	016300	000006		SWP.01:	MOV	FSTBLK(R3),R0	;GET A BLK
≡SWP.1≠≠TSTB≡≡TAG≡≡R0≡≥	012766	105760	177777		SWP.1:	TSTB	TAG(R0)		;ALLOCATED?
≠BEQ≡≡SWP.1N≡≥	012772	001403				BEQ	SWP.1N		;NO
≠INC≡≡NALLOC≡≡R2≡≥	012774	005262	000026			INC	NALLOC(R2)	;YES
≠BR≡≡SWP.2≡≥	013000	000407				BR	SWP.2
≡SWP.1N≠≠INC≡≡NFREE≡≡R2≡≥	013002	005262	000030		SWP.1N:	INC	NFREE(R2)	;LINK UP A FREE
≠MOV≡≡FFREE≡≡R2≡≡WORD0≡≡R0≡≥	013006	016260	000020	000000		MOV	FFREE(R2),WORD0(R0)
≠MOV≡≡R0≡≡FFREE≡≡R2≡≥	013014	010062	000020			MOV	R0,FFREE(R2)
≡SWP.2≠≠ADD≡≡R4≡≡R0≡≥	013020	060400			SWP.2:	ADD	R4,R0		;BUMP POINTER TO NEXT IN BUFFER
≠CMP≡≡R0≡≡LSTBLK≡≡R3≡≥	013022	020063	000004			CMP	R0,LSTBLK(R3)	;DONE BUFFER??
≠BLE≡≡SWP.1≡≥	013026	003757				BLE	SWP.1		;NO
≠MOV≡≡NXTBUF≡≡R3≡≡R3≡≥	013030	016303	000000			MOV	NXTBUF(R3),R3	;YES GO ON TO NEXT
≠BNE≡≡SWP.01≡≥	013034	001352				BNE	SWP.01		;IF THERE IS ONE
≡SWP.3≠≠CMP≡≡NFREE≡≡R2≡≡NMIN≡≡R2≡≥	013036	026262	000030	000012	SWP.3:	CMP	NFREE(R2),NMIN(R2)	;NEED MORE??
≠BGT≡≡SWP.5≡≥	013044	003010				BGT	SWP.5		;AT LEAST HAVE MIN NUMBER
≡SWP.4≠≤CALL≡≥					SWP.4:	CALL	ADDBUF,<R2>	;NO, ADD A BUFFER FULL
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R2≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡ADDBUF≡≠BR≡≡SWP.3≡≥	013064	000764				BR	SWP.3		;AND TRY AGAIN
≡SWP.5≠≠MOV≡≡NFREE≡≡R2≡≡R0≡≥	013066	016200	000030		SWP.5:	MOV	NFREE(R2),R0	;SEE IF HIGH ENOUGH PERCENTAGE
≠ADD≡≡NALLOC≡≡R2≡≡R0≡≥	013072	066200	000026			ADD	NALLOC(R2),R0	;OF FREES
≠MUL≡≡NPCT≡≡R2≡≡R0≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 31
	SMALLB PAL[HAL,HE]	PAGE 8.1 	SMALL BLOCK ALLOCATOR

≥	013076	070062	000014			MUL	NPCT(R2),R0	; 
≠DIV≡≡R0≡≥	013102	071027	000144			DIV	#144,R0		; NPCT*(NFREE+NALLOC)/=100
≠CMP≡≡NFREE≡≡R2≡≡R0≡≥	013106	026200	000030			CMP	NFREE(R2),R0	;
≠BGT≡≡SWP.6≡≥	013112	003010				BGT	SWP.6		;IF DONT HAVE ENOUGH
≤CALL≡≥						CALL	ADDBUF,<R2>	;GET A BUFFER LOAD
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R2≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡ADDBUF≡≠BR≡≡SWP.5≡≥	013132	000755				BR	SWP.5		;AND TRY AGAIN
≡SWP.6≠≠MOV≡≡SP≡≡R4≡≥	013134	012604			SWP.6:	MOV	(SP)+,R4	;RESTORE
≠MOV≡≡SP≡≡R3≡≥	013136	012603				MOV	(SP)+,R3
≠RTS≡≡PC≡≥	013140	000207				RTS	PC
≥					
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 32
	SMALLB PAL[HAL,HE]	PAGE 9 	SMALL BLOCK ALLOCATOR

≥					ROUTINE GC
≠.IFNB≡≡GC≠≤CALL≡≥						CALL	MARKPH		;MARK EVERYONE
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡MARKPH≡≠TST≡≡CPFYOK≡≥	013156	005767	176636			TST	CPFYOK		;IF DONT WANT COMPACTIFICATION
≠BEQ≡≡SWPPIT≡≥	013162	001406				BEQ	SWPPIT		;THEN DONT DO IT
≤CALL≡≥						CALL	CPFY		;COMPACTIFY
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡CPFY≡≡SWPPIT≠≤CALL≡≥					SWPPIT:	CALL	SWEEP		;SWEEP UP LOOSE GARBAGE
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡SWEEP≡≠RTS≡≡RF≡≥	013214	000205				RTS	RF
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 33
	SMALLB PAL[HAL,HE]	PAGE 10 	SMALL BLOCK ALLOCATOR

≥					;GETSBK & GETBLK
≥					;
≥					
≡GETSBK≠≥					GETSBK:	
≥					;
≥					;	MOV	[SIZE DESCRIPTOR],R0
≥					;	JSR	PC,GETBLK
≥					;	<RETURNS WITH A BLOCK IN R0>
≥					;
≠MOV≡≡R0≡≡R1≡≥	013216	010001				MOV	R0,R1			
≡GETBL1≠≠TST≡≡R1≡≥	013220	005701			GETBL1:	TST	R1			;ERROR TRAP
≠BEQ≡≡GETBER≡≥	013222	001457				BEQ	GETBER
≠MOV≡≡FFREE≡≡R1≡≡R0≡≥	013224	016100	000020			MOV	FFREE(R1),R0		;R0 ← FIRST FREE
≠BNE≡≡GETBLX≡≥	013230	001027				BNE	GETBLX			;DID WE GET ONE
≠MOV≡≡R1≡≡SP≡≥	013232	010146				MOV	R1,-(SP)		;NO,
≠TST≡≡GCFG≡≡R1≡≥	013234	005761	000010			TST	GCFG(R1)		;IS GC OK FOR THIS AREA?
≠BEQ≡≡GETADB≡≥	013240	001403				BEQ	GETADB			;NO, MUST ADD
≠TST≡≡GCOK≡≥	013242	005767	176550			TST	GCOK			;IS GARBAGE COLLECTION OK AT ALL
≠BNE≡≡GETGC≡≥	013246	001010				BNE	GETGC			;
≡GETADB≠≤CALL≡≥					GETADB:	CALL	ADDBUF,<R1>		;NO, JUST GET A BUFFER
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R1≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡ADDBUF≡≠BR≡≡GETBXX≡≥	013266	000406				BR 	GETBXX			;
≡GETGC≠≤CALL≡≥					GETGC:	CALL	GC			;YES, GC
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡GC≡≡GETBXX≠≠MOV≡≡SP≡≡R1≡≥	013304	012601			GETBXX:	MOV	(SP)+,R1		;
≠BR≡≡GETBL1≡≥	013306	000744				BR	GETBL1
≡GETBLX≠≠MOV≡≡WORD0≡≡R0≡≡FFREE≡≡R1≡≥	013310	016061	000000	000020	GETBLX:	MOV	WORD0(R0),FFREE(R1)	;NEW FREE LIST
≠INC≡≡NALLOC≡≡R1≡≥	013316	005261	000026			INC	NALLOC(R1)		;ADJUST COUNTS
≠DEC≡≡NFREE≡≡R1≡≥	013322	005361	000030			DEC	NFREE(R1)
≠MOVB≡≡IDFLAG≡≡R1≡≡TAGID≡≡R0≡≥	013326	116160	000000	177776		MOVB	IDFLAG(R1),TAGID(R0)	;REMEMBER WHAT IT IS
≠MOV≡≡R0≡≡SP≡≥	013334	010046				MOV	R0,-(SP)		;SAVE POINTER TO BLOCK
≠MOV≡≡SIZE≡≡R1≡≡R1≡≥	013336	016101	000004			MOV	SIZE(R1),R1		;WORD COUNT
≡GETB.C≠≠CLR≡≡R0≡≥	013342	005020			GETB.C:	CLR	(R0)+			;CLEAR A WORD
≠DEC≡≡R1≡≥	013344	005301				DEC	R1			;COUNT DOWN
≠BGT≡≡GETB.C≡≥	013346	003375				BGT	GETB.C			;UNTIL DONE
≠MOV≡≡SP≡≡R0≡≥	013350	012600				MOV	(SP)+,R0		;RETURN VALUE BACK
≠RTS≡≡PC≡≥	013352	000207				RTS	PC
≥					
≥					;
≥					;	MOV	#ID,R0
≥					;	JSR	PC,GETBLK
≥					;
≡GETBLK≠≠JSR≡≡PC≡≡GETSID≡≥	013354	004767	000142		GETBLK:	JSR	PC,GETSID		;SET UP SPC DSCR IN R1
≠BR≡≡GETBL1≡≥	013360	000717				BR	GETBL1
≥					
≡GETBER≠≤HALERR≡≥					GETBER:	HALERR	GERMSG
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡GERMSG≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≠CLR≡≡R0≡≥	013430	005000				CLR	R0
≠RTS≡≡PC≡≥	013432	000207				RTS	PC
≥					
≡GERMSG≠≤ASCIE≡≥					GERMSG:	ASCIE	/ATTEMPT TO ALLOCATE RECORD WITHOUT GIVING DESCRIPTOR/
≠.ASCIZ≡≠.EVEN≡≥					
≡GETSID≠≠MOV≡≡R0≡≡R1≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 34
	SMALLB PAL[HAL,HE]	PAGE 10.1 	SMALL BLOCK ALLOCATOR

≥	013522	010001			GETSID:	MOV	R0,R1
≠CMP≡≡R0≡≡MAXIDF≡≥	013524	020027	000010			CMP	R0,#MAXIDF		;IN THE TABLE?
≠BGT≡≡GETS.1≡≥	013530	003004				BGT	GETS.1			;NO
≠ASL≡≡R1≡≥	013532	006301				ASL	R1
≠MOV≡≡SIDTBL≡≡R1≡≡R1≡≥	013534	016101	012024			MOV	SIDTBL(R1),R1		;YES
≡GETS.X≠≠RTS≡≡PC≡≥	013540	000207			GETS.X:	RTS	PC			;
≡GETS.1≠≠MOV≡≡SIDLST≡≡R1≡≥	013542	016701	176254		GETS.1:	MOV	SIDLST,R1		;SEARCH CHAIN
≠BEQ≡≡GETS.X≡≥	013546	001774				BEQ	GETS.X
≡GETS.2≠≠CMP≡≡R0≡≡IDFLAG≡≡R1≡≥	013550	020061	000000		GETS.2:	CMP	R0,IDFLAG(R1)		;THIS ONE??
≠BNE≡≡GETS.X≡≥	013554	001371				BNE	GETS.X			;YES
≠MOV≡≡NXTSID≡≡R1≡≡R1≡≥	013556	016101	000016			MOV	NXTSID(R1),R1		;NO, TRY NEXT
≠BNE≡≡GETS.2≡≥	013562	001372				BNE	GETS.2
≠RTS≡≡PC≡≥	013564	000207				RTS	PC
≥					
≡PTRSID≠≠MOV≡≡R0≡≡SP≡≥	013566	010046			PTRSID:	MOV	R0,-(SP)		;SINCE GETSID WILL MUNCH
≠MOVB≡≡TAGID≡≡R0≡≡R0≡≥	013570	116000	177776			MOVB	TAGID(R0),R0		;THE ID FLAG
≠JSR≡≡PC≡≡GETSID≡≥	013574	004767	177722			JSR	PC,GETSID		;GET SID INTO R1
≠MOV≡≡SP≡≡R0≡≥	013600	012600				MOV	(SP)+,R0		;GET PTR BACK
≠RTS≡≡PC≡≥	013602	000207				RTS	PC
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 35
	SMALLB PAL[HAL,HE]	PAGE 11 	SMALL BLOCK ALLOCATOR

≥					;FREBLK & FRESBK
≥					;	MOV	BLK,R0
≥					;	JSR	PC,FREBLK
≥					;
≡FREBLK≠≠MOV≡≡SIDLST≡≡R1≡≥	013604	016701	176212		FREBLK: MOV	SIDLST,R1	;FIND THE SPACE
≠BEQ≡≡FREBER≡≥	013610	001423				BEQ	FREBER		;THIS CAME FROM
≡FREB.1≠≠CMPB≡≡TAGID≡≡R0≡≡IDFLAG≡≡R1≡≥	013612	126061	177776	000000	FREB.1:	CMPB	TAGID(R0),IDFLAG(R1) ;WAS IT THIS AREA
≠BNE≡≡FREB.2≡≥	013620	001014				BNE	FREB.2		;NO
≡FREB.≠≠MOV≡≡FFREE≡≡R1≡≡WORD0≡≡R0≡≥	013622	016160	000020	000000	FREB.:	MOV	FFREE(R1),WORD0(R0);FOUND THE AREA, PUT ON FREE CHAIN
≠MOV≡≡R0≡≡FFREE≡≡R1≡≥	013630	010061	000020			MOV	R0,FFREE(R1)
≠INC≡≡NFREE≡≡R1≡≥	013634	005261	000030			INC	NFREE(R1)	;ADJUST COUNTS
≠DEC≡≡NALLOC≡≡R1≡≥	013640	005361	000026			DEC	NALLOC(R1)
≠CLRB≡≡TAG≡≡R0≡≥	013644	105060	177777			CLRB	TAG(R0)		;JUST FOR RANDOMNESS
≠RTS≡≡PC≡≥	013650	000207				RTS	PC		;DONE
≡FREB.2≠≠MOV≡≡NXTSID≡≡R1≡≡R1≡≥	013652	016101	000016		FREB.2:	MOV	NXTSID(R1),R1	;LOOK AT NEXT
≠BNE≡≡FREB.1≡≥	013656	001355				BNE	FREB.1		;ITERATE
≡FREBER≠≤HALERR≡≥					FREBER:	HALERR	FRERMS
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRERMS≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FRERMS≠≤ASCIE≡≥					FRERMS:	ASCIE	/ATTEMPT TO DELETE A BLOCK FROM AN AREA I CANNOT FIND/
≠.ASCIZ≡≠.EVEN≡≠RTS≡≡PC≡≥	014014	000207				RTS	PC
≥					
≡FRESBK≠≠CMPB≡≡TAGID≡≡R0≡≡IDFLAG≡≡R1≡≥	014016	126061	177776	000000	FRESBK:	CMPB	TAGID(R0),IDFLAG(R1)	;BE SURE THIS IS OK
≠BEQ≡≡FREB.≡≥	014024	001676				BEQ	FREB.		;WE WIN
≤HALERR≡≥						HALERR	FRBER2
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRBER2≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≠BR≡≡FREB.≡≥	014074	000652				BR	FREB.		;DO IT ANYHOW IF CONTINUES IT
≥					
≡FRBER2≠≤ASCIE≡≥					FRBER2:	ASCIE	/ID DISAGREEMENT FOR FRESBK/
≠.ASCIZ≡≠.EVEN≡≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 36
	SMALLB PAL[HAL,HE]	PAGE 12 	SMALL BLOCK ALLOCATOR

≥					ROUTINE NEWSPC,<SZ,IDF,NPB,GCF,NMN,NPC>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SZ≠≡NNNN≡≡NNNN≠≡NNNN≡≡IDF≠≡NNNN≡≡NNNN≠≡NNNN≡≡NPB≠≡NNNN≡≡NNNN≠≡NNNN≡≡GCF≠≡NNNN≡≡NNNN≠≡NNNN≡≡NMN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NPC≠≡NNNN≡≡NNNN≠≡NEWSPC≠≥					
≠MOV≡≡SPCHDR≡≡R0≡≥	014132	012700	000015			MOV	#SPCHDR/2,R0	;GET A BLOCK OF CORE
≠JSR≡≡PC≡≡GTFREE≡≥	014136	004767	174706			JSR 	PC,GTFREE
≠MOV≡≡SZ≡≡RF≡≡SIZE≡≡R0≡≥	014142	016560	000014	000004		MOV	SZ(RF),SIZE(R0) ;REMEMBER HOW BIG
≠MOV≡≡NPB≡≡RF≡≡NPERB≡≡R0≡≥	014150	016560	000010	000006		MOV	NPB(RF),NPERB(R0) ;
≠MOV≡≡IDF≡≡RF≡≡IDFLAG≡≡R0≡≥	014156	016560	000012	000000		MOV	IDF(RF),IDFLAG(R0) ;
≠MOV≡≡NMN≡≡RF≡≡NMIN≡≡R0≡≥	014164	016560	000004	000012		MOV	NMN(RF),NMIN(R0);
≠MOV≡≡NPC≡≡RF≡≡NPCT≡≡R0≡≥	014172	016560	000002	000014		MOV	NPC(RF),NPCT(R0);
≡NEWS.1≠≠MOV≡≡SIDLST≡≡NXTSID≡≡R0≡≥	014200	016760	175616	000016	NEWS.1:	MOV	SIDLST,NXTSID(R0)  ;LINK ONTO ID CHAIN
≠MOV≡≡R0≡≡SIDLST≡≥	014206	010067	175610			MOV	R0,SIDLST
≠MOV≡≡IDFLAG≡≡R0≡≡R1≡≥	014212	016001	000000			MOV	IDFLAG(R0),R1	;WILL IT FIT IN ID CHAIN
≠CMP≡≡R1≡≡MAXIDF≡≥	014216	020127	000010			CMP	R1,#MAXIDF	;WILL IT FIT INTO TABLE
≠BGT≡≡NEWS.2≡≥	014222	003003				BGT	NEWS.2		;
≠ASL≡≡R1≡≥	014224	006301				ASL	R1		;YES
≠MOV≡≡R0≡≡SIDTBL≡≡R1≡≥	014226	010061	012024			MOV	R0,SIDTBL(R1)	;PUT INTO TABLE
≡NEWS.2≠≠CLR≡≡FSTBUF≡≡R0≡≥	014232	005060	000022		NEWS.2:	CLR	FSTBUF(R0)	;ZEROE OUT OTHER THINGS
≠CLR≡≡LSTBUF≡≡R0≡≥	014236	005060	000024			CLR	LSTBUF(R0)	;
≠CLR≡≡NALLOC≡≡R0≡≥	014242	005060	000026			CLR	NALLOC(R0)
≠CLR≡≡NFREE≡≡R0≡≥	014246	005060	000030			CLR	NFREE(R0)
≠RTS≡≡RF≡≥	014252	000205				RTS	RF		;RETURN
≥					
≤ROUTIN≡≥					ROUTINE SETSPC,<SPCHDR>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPCHDR≠≡NNNN≡≡NNNN≠≡SETSPC≠≠MOV≡≡SPCHDR≡≡RF≡≡R0≡≥	014254	016500	000002			MOV	SPCHDR(RF),R0	;
≠BR≡≡NEWS.1≡≥	014260	000747				BR	NEWS.1		;GO INITIALIZE ALL NON-CONSTANT THINGS
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 37
	SMALLB PAL[HAL,HE]	PAGE 13 	SMALL BLOCK ALLOCATOR

≥					ROUTINE ADDBUF,<SPACE>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPACE≠≡NNNN≡≡NNNN≠≡ADDBUF≠≥					;ADDS ANOTHER BUFFER TO THE NAMED SPACE
≠MOV≡≡R2≡≡SP≡≥	014262	010246				MOV	R2,-(SP)		;SAVE A REGISTER
≠MOV≡≡R3≡≡SP≡≥	014264	010346				MOV	R3,-(SP)
≠MOV≡≡SPACE≡≡RF≡≡R2≡≥	014266	016502	000002			MOV	SPACE(RF),R2
≠MOV≡≡SIZE≡≡R2≡≡R1≡≥	014272	016201	000004			MOV	SIZE(R2),R1		;CALCULATE WORD REQUIREMENTS
≠INC≡≡R1≡≥	014276	005201				INC	R1			;ONE WORD OVERHEAD FOR TAG & ID BYTES
≠MOV≡≡R1≡≡SP≡≥	014300	010146				MOV	R1,-(SP)		;WILL NEED THIS LATER
≠MUL≡≡NPERB≡≡R2≡≡R1≡≥	014302	070162	000006			MUL	NPERB(R2),R1		;SIZE*NUMBER OF BLOCKS
≠ADD≡≡BUFHDR≡≡R1≡≥	014306	062701	000004			ADD	#BUFHDR/2,R1		;
≠MOV≡≡R1≡≡R0≡≥	014312	010100				MOV	R1,R0			;
≠JSR≡≡PC≡≡GTFREE≡≥	014314	004767	174530			JSR	PC,GTFREE		;GET A BLOCK
≠MOV≡≡LSTBUF≡≡R2≡≡R1≡≥	014320	016201	000024			MOV	LSTBUF(R2),R1		;LINK ONTO CHAIN
≠MOV≡≡R1≡≡PRVBUF≡≡R0≡≥	014324	010160	000002			MOV	R1,PRVBUF(R0)		;LINK BACK
≠BEQ≡≡ADB.01≡≥	014330	001403				BEQ	ADB.01			;
≠MOV≡≡R0≡≡NXTBUF≡≡R1≡≥	014332	010061	000000			MOV	R0,NXTBUF(R1)		;AND PERHAPS FORWARD
≠BR≡≡ADB.1≡≥	014336	000402				BR	ADB.1			;
≡ADB.01≠≠MOV≡≡R0≡≡FSTBUF≡≡R2≡≥	014340	010062	000022		ADB.01:	MOV	R0,FSTBUF(R2)		;IF WAS NO LSTBUF, THEN THIS IS FSTBUF
≡ADB.1≠≠CLR≡≡NXTBUF≡≡R0≡≥	014344	005060	000000		ADB.1:	CLR	NXTBUF(R0)		;CLEAN UP
≠MOV≡≡R0≡≡LSTBUF≡≡R2≡≥	014350	010062	000024			MOV	R0,LSTBUF(R2)		;NEW NEWEST BLOCK
≠MOV≡≡R0≡≡R3≡≥	014354	010003				MOV	R0,R3			;
≠ADD≡≡BUFHDR≡≡R3≡≥	014356	062703	000012			ADD	#2+BUFHDR,R3		;POINTER AT FIRST BLOCK
≠MOV≡≡R3≡≡FSTBLK≡≡R0≡≥	014362	010360	000006			MOV	R3,FSTBLK(R0)		;REMEMBER IT
≠MOV≡≡NPERB≡≡R2≡≡R1≡≥	014366	016201	000006			MOV	NPERB(R2),R1		;
≠ASL≡≡SP≡≥	014372	006316				ASL	(SP)			;NUMBER OF BYTES TO STEP BY
≠SUB≡≡SP≡≡R3≡≥	014374	161603				SUB	(SP),R3			;TO UNDO FIRST ADD
≥					
≡ADB.2≠≠ADD≡≡SP≡≡R3≡≥	014376	061603			ADB.2:	ADD	(SP),R3
≠INC≡≡NFREE≡≡R2≡≥	014400	005262	000030			INC	NFREE(R2)		;ONE MORE FREE
≠CLRB≡≡TAG≡≡R3≡≥	014404	105063	177777			CLRB	TAG(R3)			;CLEAR TAG
≠MOVB≡≡IDFLAG≡≡R2≡≡TAGID≡≡R3≡≥	014410	116263	000000	177776		MOVB	IDFLAG(R2),TAGID(R3)	;SET TYPE ID
≠MOV≡≡FFREE≡≡R2≡≡WORD0≡≡R3≡≥	014416	016263	000020	000000		MOV	FFREE(R2),WORD0(R3)	;CONS ONTO FREE LIST
≠MOV≡≡R3≡≡FFREE≡≡R2≡≥	014424	010362	000020			MOV	R3,FFREE(R2)		;
≠DEC≡≡R1≡≥	014430	005301				DEC	R1			;ITERATE
≠BGT≡≡ADB.2≡≥	014432	003361				BGT	ADB.2			;IF ANY LEFT
≥					
≠MOV≡≡R3≡≡LSTBLK≡≡R0≡≥	014434	010360	000004			MOV	R3,LSTBLK(R0)		;R3 NOW POINTS AT LAST BLOCK
≠TST≡≡SP≡≥	014440	005726				TST	(SP)+			;POP
≠MOV≡≡SP≡≡R3≡≥	014442	012603				MOV	(SP)+,R3		;RESTORE ACS
≠MOV≡≡SP≡≡R2≡≥	014444	012602				MOV	(SP)+,R2
≠RTS≡≡RF≡≥	014446	000205				RTS	RF
≥					
≤ROUTIN≡	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 38
	SMALLB PAL[HAL,HE]	PAGE 14 	SMALL BLOCK ALLOCATOR

≥					ROUTINE FSINI
≠.IFNB≡≡FSINI≠≠CLR≡≡SIDLST≡≥	014450	005067	175346			CLR	SIDLST
≠CLR≡≡GCOK≡≥	014454	005067	175336			CLR	GCOK
≠CLR≡≡CPFYOK≡≥	014460	005067	175334			CLR	CPFYOK
≠CLR≡≡MMETHS≡≥	014464	005067	175324			CLR	MMETHS
≤CALL≡≥						CALL	SETSPC,<#VCTSPC>
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡VCTSPC≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡SETSPC≡≠RTS≡≡RF≡≥	014510	000205				RTS	RF
≥					
≠.IFNZ≡≡SMBDBG≡≥		000001			.IFNZ	SMBDBG
≡FSTEST≠≤CALL≡≥					FSTEST:	CALL	FSINI
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡FSINI≡≠MOV≡≡R2≡≥	014526	012702	000020			MOV	#20,R2
≠MOV≡≡VCTARA≡≡R3≡≥	014532	012703	015020			MOV	#VCTARA,R3
≡FST.1≠≠MOV≡≡VCTID≡≡R0≡≥	014536	012700	000001		FST.1:	MOV	#VCTID,R0
≠JSR≡≡PC≡≡GETBLK≡≥	014542	004767	176606			JSR	PC,GETBLK
≡FST.2≠≠MOV≡≡R0≡≡R3≡≥	014546	010023			FST.2:	MOV	R0,(R3)+
≠DEC≡≡R2≡≥	014550	005302				DEC	R2
≠BGT≡≡FST.1≡≥	014552	003371				BGT	FST.1
≡FST.3≠≠MOV≡≡R2≡≥	014554	012702	000013		FST.3:	MOV	#13,R2
≡FST.4≠≠MOV≡≡R3≡≡R0≡≥	014560	014300			FST.4:	MOV	-(R3),R0
≠JSR≡≡PC≡≡FREBLK≡≥	014562	004767	177016			JSR	PC,FREBLK
≠DEC≡≡R2≡≥	014566	005302				DEC	R2
≠BGT≡≡FST.4≡≥	014570	003373				BGT	FST.4
≡FST.5≠≠MOV≡≡R2≡≥	014572	012702	000017		FST.5:	MOV	#17,R2
≡FST.6≠≠MOV≡≡VCTID≡≡R0≡≥	014576	012700	000001		FST.6:	MOV	#VCTID,R0
≠JSR≡≡PC≡≡GETBLK≡≥	014602	004767	176546			JSR	PC,GETBLK
≠MOV≡≡R0≡≡R3≡≥	014606	010023				MOV	R0,(R3)+
≠DEC≡≡R2≡≥	014610	005302				DEC	R2
≠BGT≡≡FST.6≡≥	014612	003371				BGT	FST.6
≡FST.10≠≠MOV≡≡TSTMTH≡≡R0≡≥	014614	012700	015424		FST.10:	MOV	#TSTMTH,R0
≠JSR≡≡PC≡≡LNKMTH≡≥	014620	004767	175302			JSR	PC,LNKMTH
≠MOV≡≡R3≡≡VCTUB≡≥	014624	010367	000570			MOV	R3,VCTUB
≠SUB≡≡VCTUB≡≥	014630	162767	000002	000562		SUB	#2,VCTUB
≠MOV≡≡VCTARA≡≡VCTLB≡≥	014636	012767	015020	000556		MOV	#VCTARA,VCTLB
≠MOV≡≡GCOK≡≥	014644	012767	177777	175144		MOV	#-1,GCOK
≤CALL≡≥						CALL	GC
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡GC≡≡FST.11≠≠MOV≡≡R2≡≥	014666	012702	000010		FST.11:	MOV	#10,R2
≡FST.12≠≠MOV≡≡VCTSPC≡≡R0≡≥	014672	012700	011762		FST.12:	MOV	#VCTSPC,R0
≠JSR≡≡PC≡≡GETSBK≡≥	014676	004767	176314			JSR	PC,GETSBK
≠DEC≡≡R2≡≥	014702	005302				DEC	R2
≠BGT≡≡FST.12≡≥	014704	003372				BGT	FST.12
≥					
≤HALERR≡≥						HALERR	DNMSG
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡DNMSG≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≥					
≡DNMSG≠≤ASCIE≡≥					DNMSG:	ASCIE	/
≠.ASCIZ≡≥	014774	   127		
≥	014775	   105		
≥	014776	   114		
≥	014777	   114		
≥	015000	   040		
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 39
	SMALLB PAL[HAL,HE]	PAGE 14.1 	SMALL BLOCK ALLOCATOR

≥	015001	   110		
≥	015002	   117		
≥	015003	   127		
≥	015004	   040		
≥	015005	   104		
≥	015006	   111		
≥	015007	   104		
≥	015010	   040		
≥	015011	   127		
≥	015012	   105		
≥	015013	   040		
≥	015014	   104		
≥	015015	   117		
≥	015016	   077		
≥	015017	   000		
≥					WELL HOW DID WE DO?/
≥					
≡VCTARA≠≠.BLKW≡≥		015420			VCTARA:	.BLKW	200
≡VCTUB≠≥	015420	000000			VCTUB:	0
≡VCTLB≠≥	015422	000000			VCTLB:	0
≥					
≡TSTMTH≠≤MMETH≡≥					TSTMTH:	MMETH	TSTRTN
≡TSTRTN≡≡TSTRTN≡≥					
≤ROUTIN≡≥					ROUTINE TSTRTN,<RTN>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡RTN≠≡NNNN≡≡NNNN≠≡TSTRTN≠≠MOV≡≡R2≡≡SP≡≥	015430	010246				MOV	R2,-(SP)
≠MOV≡≡VCTLB≡≡R2≡≥	015432	016702	177764			MOV	VCTLB,R2
≡TST.R1≠≠CMP≡≡R2≡≡VCTUB≡≥	015436	020267	177756		TST.R1:	CMP	R2,VCTUB
≠BGT≡≡TSTRTS≡≥	015442	003005				BGT	TSTRTS
≠MOV≡≡R2≡≡R0≡≥	015444	011200				MOV	(R2),R0
≠JSR≡≡PC≡≡MARKR0≡≥	015446	004767	174442			JSR	PC,MARKR0
≠MOV≡≡R0≡≡R2≡≥	015452	010022				MOV	R0,(R2)+
≠BR≡≡TST.R1≡≥	015454	000770				BR	TST.R1
≡TSTRTS≠≠MOV≡≡SP≡≡R2≡≥	015456	012602			TSTRTS:	MOV	(SP)+,R2
≠RTS≡≡RF≡≥	015460	000205				RTS	RF
≥					
≥					.ENDC
≥					
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 40
	HAL PAL[HAL,HE]	PAGE 2.2 	SMALL BLOCK ALLOCATOR

≥					
≥					; program initialization
≥					
≠.EVEN≡≥		015462			.EVEN
≡START≠≠RESET≡≠RESET≡≥	015462	000005			START:	RESET
≠MOV≡≡SP≡≥	015464	012706	000500			MOV #500,SP	;initialize stack
≠CLR≡≡PS≡≥	015470	005067	162302			CLR PS		;initialize processor status
≡CLKIN≠≠CLR≡≡CLKCNT≡≥	015474	005067	155044		CLKIN:	CLR CLKCNT	;clear clock registers- trap restart
≠CLR≡≡CLKSET≡≥	015500	005067	155036			CLR CLKSET
≠CLR≡≡CLKS≡≥	015504	005067	155030			CLR CLKS
≤HALERR≡≥						HALERR RUGMES	;Finished here.  Terminate cleanly.
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≥					
≡PATCH≠≠.BLKW≡≥		015756			PATCH:	.BLKW	100
≥					
≠.END≡≡START≡≥		015462			.END START
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 41
	HAL PAL[HAL,HE]	PAGE 2 	***SYMBOL TABLE***      

	AC0	000000R		FREL	004000		GTFREE	011050		NEWSPC	014132	
	AC1	000001R		FRERMS	013726		HCOR	077776		NFREE	000030H	
	AC2	000002R		FRESBK	014016		IBUF	000150		NMIN	000012H	
	AC3	000003R		FRINER	010730		IDF	000012H		NMN	000004H	
	AC4	000004R		FRINIT	010674		IDFLAG	000000H		NNNN	000000H	
	AC5	000005R		FRINMS	010776		II	000004H		NPB	000010H	
	ADB.01	014340		FRMS1	011322		ILGINS	000010		NPC	000002H	
	ADB.1	014344		FRMS2	011376		INVMRK	000004H		NPCT	000014H	
	ADB.2	014376		FROVFL	011254		KBIR	177562		NPERB	000006H	
	ADDBUF	014262		FRPOS	011114		KBIS	177560		NXF.0	012420	
	BUFHDR	000010H		FRRET	011166		KBOR	177566		NXF.1	012424	
	CHGCOD	000002H		FRTRY	011066		KBOS	177564		NXF.3	012464	
	CLKCNT	172544		FSINI	014450		LINKB	000004H		NXF.4	012466	
	CLKIN	015474		FST.1	014536		LINKF	000002H		NXF.NX	012432	
	CLKS	172540		FST.10	014614		LNKMTH	012126		NXR.0	012472	
	CLKSET	172542		FST.11	014666		LSTBLK	000004H		NXR.1	012476	
	CLKTRP	000104		FST.12	014672		LSTBUF	000024H		NXR.3	012536	
	CPFY	012544		FST.2	014546		MAPLP	012056		NXR.4	012540	
	CPFY.1	012330		FST.3	014554		MAPPTR	012046		NXR.NX	012504	
	CPFY.2	012410		FST.4	014560		MAPRTN	000002H		NXTBUF	000000H	
	CPFYLP	012554		FST.5	014572		MAPRTS	012104		NXTCHG	000000H	
	CPFYNX	012600		FST.6	014576		MARK0	006400		NXTCLC	000000H	
	CPFYOK	012020		FSTBLK	000006H		MARK1	006401		NXTGN	000000H	
	CPFYRT	012626		FSTBUF	000022H		MARK2	006402		NXTMTH	000002H	
	CPFYSP	012272		FSTEST	014512		MARK3	006403		NXTSID	000016H	
	CPFYXX	012606		GC	013142		MARK4	006404		OBUF	000160	
	CPYR	012352		GCF	000006H		MARK5	006405		PATCH	015556	
	CRLFX	000626		GCFG	000010H		MARKPH	012142		PC	000007R	
	DATUM	000000H		GCOK	012016		MARKR0	012114		PLACES	000000	
	DNMSG	014754		GERMSG	013434		MAXIDF	000010H		PRVBUF	000002H	
	ERRTRP	000004		GETADB	013250		MERGR	011476		PRVGN	000002H	
	FEXACT	011174		GETB.C	013342		METH	000000H		PS	177776	
	FFOUND	011126		GETBER	013362		MKP.02	012176		PTRSID	013566	
	FFREE	000020H		GETBL1	013220		MKPH.1	012154		R0	000000R	
	FORM	000004H		GETBLK	013354		MKPH.2	012202		R1	000001R	
	FR1	011116		GETBLX	013310		MKPH.3	012220		R2	000002R	
	FR2	011100		GETBXX	013304		MKPH.A	012226		R3	000003R	
	FRBER2	014076		GETGC	013270		MKPHRT	012254		R4	000004R	
	FREB.	013622		GETS.1	013542		MKROUT	012262		RADIX	000544	
	FREB.1	013612		GETS.2	013550		MKRTJM	012110		RF	000005R	
	FREB.2	013652		GETS.X	013540		MMETHS	012014		RL1	011516	
	FREBER	013660		GETSBK	013216		MUNLNK	012632		RLFER1	011526	
	FREBLK	013604		GETSID	013522		MUNRTS	012646		RLFER2	011574	
	FREEND	010670		GNCHGS	000014H		NALLOC	000026H		RLFREE	011426	
	FREEPT	000666		GNCLCS	000012H		NEEDED	000002H		RLMS1	011642	
	FREERR	011206		GNDEPS	000010H		NEWS.1	014200		RLMS2	011712	
	FREEST	000672		GNVAL	000006H		NEWS.2	014232		RLRET	011520	
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 42
	HAL PAL[HAL,HE]	PAGE 2 	***SYMBOL TABLE***      

	ROUT	000002H		TYPSTR	000500	
	RTN	000002H		VCTARA	015020	
	RUG	050000		VCTID	000001H	
	RUGMES	000631		VCTLB	015422	
	SETSPC	014254		VCTSPC	011762	
	SIDCNT	000000H		VCTUB	015420	
	SIDLST	012022		WORD0	000000H	
	SIDTBL	012024	
	SIZE	000004H	
	SMBDBG	000001H	
	SP	000006R	
	SPACE	000002H	
	SPC	000002H	
	SPCC	000002H	
	SPCHDR	000002H	
	START	015462	
	STRT11	000500	
	SWEEP	012650	
	SWEEP1	012676	
	SWP.	012714	
	SWP.00	012724	
	SWP.01	012762	
	SWP.1	012766	
	SWP.1N	013002	
	SWP.2	013020	
	SWP.3	013036	
	SWP.4	013046	
	SWP.5	013066	
	SWP.6	013134	
	SWP.LP	012660	
	SWP.X	012672	
	SWP.XX	012710	
	SWPPIT	013200	
	SZ	000014H	
	TAG	177777H	
	TAGID	177776H	
	TSLOOP	000504	
	TST.R1	015436	
	TSTMTH	015424	
	TSTRTN	015430	
	TSTRTS	015456	
	TYPCHR	000566	
	TYPDEC	000516	
	TYPDIG	000536	
	TYPOCT	000526	
	TYPOUT	000560	
	TYPRET	000624	
	HAL Runtime System	PALX 222	09/13/74  16:31:02	PAGE 43
	HAL PAL[HAL,HE]	PAGE 2 	***SYMBOL TABLE***      


1.5 WDS AVG INSN LENGTH

19 SECONDS RUN-TIME